C 異常介紹

2021-09-25 09:37:42 字數 3167 閱讀 6191

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 上下文異常 是指在特定環境下,個體例項是正常的,但是在其它環境下是異常的。例如 在特定時間...