C 之異常處理

2021-07-09 19:20:25 字數 1276 閱讀 2113

基本理念:問題的檢測和問題的解決分離,程式的問題檢測部分可以不用了解如何處理問題

異常處理是一同通訊機制,程式的不同部分就出現了什麼錯誤進行通訊;

異常是通過丟擲(throw)物件而引發(raise)的,該物件的型別決定了應該啟用哪個處理**。被選中的處理**是呼叫鏈中與該物件型別匹配且離丟擲異常位置最為接近的那個。

異常以類似於將實參傳遞給函式的方式丟擲和捕獲。異常是可以傳給非引用形參的任意型別的物件,這意味著必須能夠複製該型別的物件。

不存在陣列和函式型別的異常(陣列和函式在作為引數傳遞時,會自動轉換為指標)

執行thow 的時候,不會執行throw後面的語句,而是將控制從throw轉移到匹配的catch, 故(1)沿著呼叫鏈的函式提早推出了,(2)一般而言,在處理異常時,丟擲異常的塊中的區域性儲存不存在了

沿著巢狀函式呼叫鏈向上尋找,為異常尋找匹配catch 子句的過程稱為棧展開(stack unwinding)

catch(...) 是catch-all 子句,可以捕獲所有型別的異常;

發生異常自動撤銷區域性物件,通過執行析構函式

用new 和delete 使用原始指標是不安全的,如果new 和delete 之間發生exception, 則delete 不會被執行,資源不會被撤銷。

raii(資源分配即初始化)是異常安全的(exception safe),即使發生異常,程式也能正常操作

raii通過設計資源管理類,以建構函式分配資源而以析構函式函式釋放資源

memory 標頭檔案中定義的auto_ptr 模板類似raii的乙個實現

異常說明(exception specification)指定,如果函式丟擲異常,被丟擲的異常是包含在該說明中的一種,或是從列出的異常中派生的型別。

異常說明跟在函式形參表後,乙個異常說明在關鍵字(throw)之後跟著乙個(可能為空的)由圓括號括住的異常型別列表:

void recoup(int) throw (std::runtime_error);

空說明列表指出函式不丟擲任何異常:

void recoup(int) throw();

如果乙個函式沒有指定異常說明,則該函式可以丟擲任意型別的異常。

異常說明是函式介面的一部分,介面是對函式通訊的一種歸納,故函式的返回型別,形參型別,異常說明構成函式介面。

違反異常說明將會導致呼叫標準庫函式unexpected,unexpected 呼叫terminate 函式終止程式。

異常說明是函式型別的一部分,故完整的函式指標定義為:

void (*pf) (int) throw(std::runtime_error);

C 之異常處理

程式中的錯誤分為編譯時的錯誤和執行時的錯誤。編譯時的錯誤主要是語法錯誤,比如 句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什麼錯誤。而執行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如記憶體空間不夠,或者在呼叫函式...

C 之異常處理

1 用try.catch.捕獲異常 注 convert是乙個類,代表型別轉換的類。toint32 是convert的乙個方法,這個方法的功能就是把指定的內容轉換成整數型別 namespace 異常 catch exception ex 出錯則執行 console.readkey 執行結果 2 異常前...

C 之異常處理

try catch exceptionname e1 catch exceptionname e2 catch exceptionname en finally 異常類 描述 system.io.ioexception 處理 i o 錯誤。system.indexoutofrangeexceptio...