◆ 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語句塊是...