《c++ primer》第五版 18.1 異常處理
關鍵字:throw、noexcept、try…catch、exception
異常處理(exception handle)機制事得**能將異常的檢測和解決過程分離開。檢測環節無需知道問題處理模組的所有細節。
throw表示式丟擲異常
try catch語句塊檢測並處理異常
exception用於在throw表示式和相關的catch子句之間傳遞異常的具體資訊
當乙個異常丟擲後,程式暫停當前函式的執行過程並立即開始查詢與異常匹配的catch子句,若在當前函式沒有找到,則會在呼叫當前函式的外部繼續查詢,沿呼叫鏈一直到找到為止。若最終都沒有找到則退出主函式後查詢過程終止。這個過程被稱為棧展開(stack unwinding)過程。
在棧展開的過程中,物件被自動銷毀。所以析構函式不應該丟擲不能被它自身處理的異常,否則將導致資源不能正確釋放。
noexcept可告知編譯器此函式不會丟擲異常,有助於編譯器優化操作。如果宣告了noexcept,而函式中又丟擲了異常,則程式會呼叫terminate,直接終止程式。
在c++11之前,通常使用throw()宣告函式異常:
class
a
c++11開始,使用noecxept宣告函式異常:
class
a
noexcept要不同時出現在函式的定義和宣告中,要不就都不出現。還可以在函式指標的宣告和定義**現:
typedef
void
(*pfun)
(int
)noexcept
;typedef
void*(
*pfun2)
(size_t)
;void
*write
(size_t v)
noexcept
intmain()
noexcept運算子是乙個一元運算子,返回乙個bool型別的右值常量表示式,用於表示給定的表示式是否會丟擲異常。和sizeof一樣,並不會對函式進行運算求值。
const
bool no_except =
noexcept
(malloc(0
));
void
*mymalloc
(size_t _size)
noexcept
(noexcept
(malloc
(_size)))
異常類
說明所在標頭檔案
exception
通用錯誤型別
exception
bad_alloc
new 錯誤
newruntime_error
執行時檢測出的錯誤
stdexcept
range_error
執行時錯誤:超出範圍錯誤
overflow_error
執行時錯誤:計算上溢
underflow_error
執行時錯誤:計算下溢
logic_error
程式邏輯錯誤
domain_error
邏輯錯誤:引數對應的結果值不存在
invalid_error
邏輯錯誤:無效引數
length_error
邏輯錯誤:長度超出範圍
out_of_error
邏輯錯誤:超出有效範圍
C 異常處理
結構化異常 structured exception vs c 異常 c exception 大家都知道c 異常是c 語言的乙個特性,使用者可以使用throw的方式來丟擲異常,try catch 來捕獲異常。結構化異常是諸如,zero divided,access violations等異常,這些異...
c 異常處理
一 概述 c 自身有著非常強的糾錯能力,發展到如今,已經建立了比較完善的異常處理機制。c 的異常情況無非兩種,一種是語法錯誤,即程式中出現了錯誤的語句,函式,結構和類,致使編譯程式無法進行。另一種是執行時發生的錯誤,一般與演算法有關。關於語法錯誤,不必多說,寫 時心細一點就可以解決。c 編譯器的報錯...
C 異常處理
程式設計師常常忽視異常處理的重要性,這給他們自己的 造成相當大損害。本文將討論如何在c 中使用異常處理,並介紹在應用 中新增 片段以防止某些錯誤的一些簡單方法,這些錯誤可能導致程式異常終止。結構化異常處理 net框架提供一種標準的錯誤報告機制稱為結構化異常處理。這種機制依賴於應用中報告錯誤的異常。在...