c語言異常處理
try程式塊:該區段包含可能會發生異常的**,在發生了異常之後,通過throw丟擲異常;
throw程式塊:throw語句用於丟擲異常,在c++中,被丟擲的異常可以是內建型別的物件,也可以是自定義型別的物件;
catch程式塊:對異常進行捕捉,處理特定型別的異常。
例一:
#include
#include
#include
#include
using
namespace
std;
#include
void test()
catch(exception e)
}int main()
程式執行結果:
3.1 異常結構體—exp
【說明】:編譯器會為每乙個「c++函式」定義乙個ehdl結構,不過只會為包含了「try」塊的函式定義tbltryblocks成員。此外,異常處理器還會為每個執行緒維護乙個指向當前異常處理框架的指標。該指標指向異常處理器鍊錶的鏈尾。
3.2 異常棧展開
例子:
#include
#include
#include
#include
using namespace std;
#include
void testb(int a, int b)
void testa(int a,int b)
c++異常棧展開
3.3 異常棧展開過程
丟擲異常的時候,將暫停當前函式的執行,開始查詢對應的匹配catch子句;
檢查throw本身是否在try內部,如若是在查詢匹配的catch語句;
如果有匹配的,則處理;若沒有,則退出當前函式棧,繼續在呼叫該函式的函式棧中查詢;
不斷重複上述過程,如果達到main函式的函式棧,依然沒有找到,匹配的catch語句,則終止程式;
但是在函式外,該異常最終會由作業系統捕獲並處理;
上述這個沿著呼叫鏈查詢匹配的catch子句的過程稱為棧展開;
找到匹配的catch子句並處理以後,會繼續沿著catch子句後面繼續執行;
3.4 棧回退(stack unwind)機制
「棧回退」是伴隨異常處理機制引入c++中的乙個概念,主要用來確保在異常被丟擲、捕獲並處理後,所有生命期已結束的物件都會被正確的析構,他們所占用的空間都會被正確的**。
4.1 含義
異常結構體exp中的 nstep 除了能夠跟蹤物件建立、銷毀階段以外,還能夠標識當前執行點是否在 try 塊中,以及(如果當前函式有多個 try 塊的話)究竟在哪個 try 塊中。這是通過在每乙個 try 塊的入口和出口各為 nstep 賦予乙個唯一 id 值,並確保 nstep 在對應 try 塊內的變化恰在此範圍之內來實現的。
在具體實現異常捕獲時,首先,c++ 異常處理器檢查發生異常的位置是否在當前函式的某個 try 塊之內。這項工作可以通過將當前函式的 nstep 值依次在pihandler指向tbltryblocks表的條目中進行範圍為 [nbeginstep, nendstep) 的比對來完成。
4.2 異常捕獲的匹配規則
異常物件的型別與catch說明符的型別必須完全匹配。只有以下幾種情況例外:
允許從非const物件到const型別物件的轉換;
允許從派生類型別到基類型別的轉換;
將陣列轉換成指向陣列型別的指標,將函式轉換為指向函式型別的指標;
4.3 異常的重新丟擲
有可能單個的catch不能完全處理乙個異常,在進行一些校正處理之後,希望再次交給更外層的呼叫鏈函式來處理,catch則可以通過重新丟擲將異常傳遞給更上層的函式來處理。
在函式宣告之後,列出該函式有可能丟擲異常型別,並保證該函式不會丟擲其他型別的異常。
成員函式再累內宣告和類外定義兩處必須有相同的異常規範;
函式丟擲乙個沒有列在它異常規範中的異常時(且函式中丟擲異常沒有在函式內部進行處理),系統呼叫c++標準庫中定義的函式unexpected();
如果異常規範為throw(),則表示不得丟擲任何異常,該函式不用放在try塊中;
派生類的虛函式的異常規範必須基類虛函式的異常規範一樣或者更嚴格(是基類虛函式的異常的子集)。因為:派生類的虛函式被指向基類型別的指標呼叫時,保證不會違背基類成員函式的異常規範;
【注】文章參考:
c++異常捕獲和處理
c++異常機制的實現方式和開銷分析
C 複習筆記 異常處理
c 語言異常處理機制的基本思想是將異常的檢測與處理分離。c 使用throw和try catch語句支援異常處理,分以下三步 1 檢查異常 使用try語句塊 2 丟擲異常 使用throw語句塊 3 捕捉異常 使用catch語句塊 throw 表示式 try catch 異常資訊型別 看例子最容易理解 ...
C C 異常處理 二
c 中內建了異常處理的語法元素 try.catch.try語句處理正常 邏輯 catch語句處理異常情況 try語句中的異常由對應的 catch語句處理 try catch c 通過throw語句丟擲異常,throw關鍵字後邊跟的是一種 異常標誌 可以是任何資料型別 包括自定義類 來代表異常。程式設...
C C 異常處理區別
c異常 c structured exception 只能處理一種型別 unsigned int c 異常 c exception 處理很多態別。c異常根據無符號整型的值來標識,而c 異常是根據資料型別來標識的。當在c程式中引發了異常後,每乙個能處理者都去檢查異常內容來決定是自己處理還是交給其他處理...