基本理念:問題的檢測和問題的解決分離,程式的問題檢測部分可以不用了解如何處理問題
異常處理是一同通訊機制,程式的不同部分就出現了什麼錯誤進行通訊;
異常是通過丟擲(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...