1. c++異常概念
異常是一種處理錯誤的方式,當乙個函式發現自己無法處理的錯誤時就可以丟擲異常,讓函式的直接或間接的呼叫者處理這個錯誤
throw:當問題出現時,程式會丟擲乙個異常。通過使用throw
關鍵字來完成
catch:在您想要處理問題的地方,通過異常處理程式捕獲異常.catch
關鍵字用於捕獲異常,可以有多個catch進行捕獲。
try:try
通常放置可能會丟擲異常的**,丟擲的異常會被 catch 捕獲,它後面通常跟著乙個或多個 catch 塊
如果有乙個塊丟擲乙個異常,捕獲異常的方法會使用 try 和 catch 關鍵字。try 塊中放置可能丟擲異常的**,try 塊中的**被稱為保護**。使用 try/catch 語句的語法如下所示:
try
catch
( exceptionname e1 )
catch
( exceptionname e2 )
catch
( exceptionname en )
2. 異常的使用
異常的丟擲和匹配原則:
異常是通過丟擲物件而引發的,該物件的型別決定了應該啟用哪個catch的處理**。
被選中的處理**是呼叫鏈中與該物件型別匹配且離丟擲異常位置最近的那乙個。
丟擲異常物件後,會生成乙個異常物件的拷貝,因為丟擲的異常物件可能是乙個臨時物件,所以會生成乙個拷貝物件,這個拷貝的臨時物件會在被catch以後銷毀。
catch(...)
可以捕獲任意型別的異常,問題是不知道異常錯誤是什麼。
實際中丟擲和捕獲的匹配原則有個例外,並不都是型別完全匹配,可以丟擲的派生類物件,使用基類捕獲
#include
using
namespace std;
double
division
(int a,
int b)
void
func()
intmain()
//捕獲 const char* 型別的異常
catch
(const
char
* errmsg)
//因為我們沒有給出所有型別的異常相對應的catch來捕獲
//如果這時丟擲乙個我們不能捕獲的異常,就用 catch(...) 來捕獲任意型別異常
//這樣就可以保證最後所有異常**獲,程式不會崩潰
catch(.
..)return0;
}
在函式呼叫鏈中異常棧展開匹配原則:首先檢查throw
本身是否在try
塊內部,如果是則查詢匹配的catch
語句。如果有匹配的,則呼叫匹配的catch
的進行處理。
沒有匹配的catch
則退出當前函式棧,繼續在呼叫函式的棧中進行查詢匹配的catch。
如果到達main
函式的棧,依舊沒有匹配的,則終止程式。上述這個沿著呼叫鏈查詢匹配的catch
子句的過程稱為棧展開。所以最後我們都要加乙個catch(...)
用來捕獲任意型別的異常,否則如果到了main函式棧依舊沒有匹配的catch將會導致異常退出
找到匹配的catch子句並處理以後,會繼續沿著catch後面繼續執行。
異常的重新丟擲:
有可能單個的catch不能完全處理乙個異常,在進行一些校正處理以後,希望再交給更外層的呼叫鏈
函式來處理,catch則可以通過重新丟擲將異常傳遞給更上層的函式進行處理。
#include
using
namespace std;
double
division
(int a,
int b)
return
(double
)a /
(double
)b;}
void
func()
catch(.
..) cout <<
"delete "
<< array << endl;
delete
array;
}int
main()
catch
(const
char
* errmsg)
return0;
}
異常安全:建構函式完成物件的構造和初始化,最好不要在建構函式中丟擲異常,否則可能導致物件不完整或沒有完全初始化
析構函式主要完成資源的清理,最好不要在析構函式內丟擲異常,否則可能導致資源洩漏
在new和delete中丟擲了異常,導致記憶體洩漏
在lock和unlock之間丟擲了異常導致死鎖
異常規範:
在函式的後面接throw(型別),列出這個函式可能拋擲的所有異常型別。
函式的後面接throw(),表示函式不拋異常。
若無異常介面宣告,則此函式可以拋擲任何型別的異常。
// 這裡表示這個函式會丟擲a/b/c/d中的某種型別的異常
void
fun(
)throw
(a,b,c,d)
;// 這裡表示這個函式只會丟擲bad_alloc的異常
void
*operator
new(std::size_t size)
throw
(std::bad_alloc)
;// 這裡表示這個函式不會丟擲異常
void
*operator
new(std::size_t size,
void
* ptr)
throw()
;
c 異常的簡單介紹
語法 1 若有異常則通過throw操作建立乙個異常物件並拋擲。2 將可能丟擲異常的程式段嵌在try塊之中。控制通過正常的順序執行到達try語句,然後執行try塊內的保護段。3 如果在保護段執行期間沒有引起異常,那麼跟在try塊後的catch子句就不執行。程式從try塊後跟隨的最後乙個catch子句後...
C 中的異常處理介紹
c 中的異常是指在程式執行時,發生的特殊情況,例如除數為0的情況。異常機制提供了一種轉移程式控制權的方式。c 中的異常處理涉及到三個關鍵字 try catch throw。關於這三個關鍵字的詳細描述如下 我們可以使用 throw 關鍵字在 中丟擲異常。throw 關鍵字操作物件的型別即為丟擲異常的型...
異常檢測介紹
一 了解異常檢測基本概念 1 什麼是異常檢測 異常檢測是指識別出與主體分布資料的分布相差較大或者與 分布的資料相差較大的資料。2 異常的類別 2.1 點異常 是指少數個體是異常的,大多數的個體是正常的。2.2 上下文異常 是指在特定環境下,個體例項是正常的,但是在其它環境下是異常的。例如 在特定時間...