C 異常的重新丟擲和catch all子句

2021-08-04 20:47:05 字數 913 閱讀 6149

◆ 1、當catch語句捕獲乙個異常後,可能不能完全處理異常,完成某些操作後,該異常必須由函式鏈中更上級的函式來處理,這時catch子句可以重新丟擲(rethrow)該異常,把異常傳遞給函式呼叫鏈中更上級的另乙個catch子句,由它進行進一步處理。

重新丟擲表示式仍為:throw;

但僅有乙個關鍵字,因為異常型別在catch語句中已經有了,不必再指明。

被重新丟擲的異常就是原來的異常物件。但是重新丟擲異常的catch子句應該把自己做過的工作告訴下乙個處理異常的catch子句,往往要對異常物件做一定修改,以表達某些資訊,因此catch子句中的異常宣告必須被宣告為引用,這樣修改才能真正做在異常物件自身中。

◆ 2、通用catch子句(catch_all):

catch(…)

任何異常都可以進入這個catch子句。這裡的三個點稱為省略號。花括號中的復合語句用來執行指定操作。

異常發生後按棧展開(stack unwinding)退出,動態分配的非類物件資源不會自動釋放的,通常在catch_all子句中釋放。例如:

void fun1()

//異常可能有多種

catch(…)//不論是那種異常都在此釋放

delete res; //正常退出前釋放資源物件res;

}◆ 3、catch_all子句可以單獨使用,也可以與其它catch子句聯合使用。如果聯合使用,它必須放在相關catch子句表的最後。

catch子句被檢查的順序與它們在try塊之後排列順序相同,一旦找到了乙個匹配,則後續的catch子句將不再檢查,按此規則,catch_all子句(catch(…){})處理表前面所列各種異常之外的異常。

如果只用catch_all子句進行某項操作,則其他的操作應由catch子句重新丟擲異常,逆呼叫鏈去查詢新的處理子句來處理,不能在子句列表中再安排乙個處理同一異常的子句,因為第二個子句是永遠執行不到的。 

丟擲異常和捕獲異常 多捕獲和最終重新丟擲的異常處理

丟擲異常和捕獲異常 joseph d.darcy宣布,在langtools團隊成員maurizio cimadamore開發的多捕獲實現成功的經驗之後,具有多捕獲和最終重新丟擲的改進的異常處理將成為即將到來的jdk 7構建的一部分。當前,使用者可以將變更集應用於jdk 7 langtools儲存庫的...

C 中的異常丟擲和捕獲

在 c 語言中,如果發生錯誤,上級函式要進行出錯處理,層層上傳,容易造成過多的出錯處理 並且傳遞的效率比較低下。try catch exceptiontype var include using namespace std void func1 catch double cout catch fun...

C 丟擲和接收異常的順序

異常 exception 是c 語言引入的錯誤處理機制。它 採用了統一的方式對程式的執行時錯誤進行處理,具有標準化 安全和高效的特點。c 為了實現異常處理,引入了三個關鍵字 try throw catch。異常由throw丟擲,格式為throw expression 由catch捕捉。try語句塊是...