throw關鍵字用來丟擲乙個異常,這個異常會被 try 檢測到,進而被 catch 捕獲。
異常既然是乙份資料,那麼就應該有資料型別。c++ 規定,異常型別可以是 int、char、float、bool 等基本型別,也可以是指標、陣列、字串、結構體、類等聚合型別。c++ 語言本身以及標準庫中的函式丟擲的異常,都是 exception 類或其子類的異常。也就是說,丟擲異常時,會建立乙個 exception 類或其子類的物件。
可以將 catch 看做乙個沒有返回值的函式,當異常發生後 catch 會被呼叫,並且會接收實參(異常資料)。
但是 catch 和真正的函式呼叫又有區別:
真正的函式呼叫,形參和實參的型別必須要匹配,或者可以自動轉換,否則在編譯階段就報錯了。
而對於 catch,異常是在執行階段產生的,它可以是任何型別,沒法提前**,所以不能在編譯階段判斷型別是否正確,只能等到程式執行後,真的丟擲異常了,再將異常型別和 catch 能處理的型別進行匹配,匹配成功的話就「呼叫」當前的 catch,否則就忽略當前的 catch。
#include #include "resource.h"
lresult callback windowprocedure (hwnd, uint, wparam, lparam);
hinstance hinst;
tchar szclassname = text("expdemo");
class base;
class derived: public base;
int winapi
winmain (hinstance hthisinstance,
hinstance hprevinstance,
lpstr lpszargument,
int nfunsterstil)
return messages.wparam;}
lresult callback
windowprocedure (hwnd hwnd, uint message, wparam wparam, lparam lparam)
catch(int)catch(char *)catch(base)catch(derived)
break;
case idm_about:
text ("expdemo"), mb_ok | mb_iconinformation);
break;
case idm_exit:
destroywindow(hwnd);
break;
default:
return defwindowproc(hwnd, message, wparam, lparam);
}break;
case wm_create:
break;
case wm_paint:
hdc = beginpaint(hwnd, &ps);
getclientrect(hwnd, &rt);
endpaint(hwnd, &ps);
break;
case wm_destroy:
postquitmessage (0);
break;
default:
return defwindowproc (hwnd, message, wparam, lparam);
}return 0;
}
執行;
定義了乙個基類 base,又從 base 派生類出了 derived。丟擲異常時,建立了乙個 derived 類的匿名物件,也就是說,異常的型別是 derived。
期望的是,異常被catch(derived)捕獲,從輸出結果可以看出,異常提前被catch(base)捕獲了,這說明 catch 在匹配異常型別時發生了向上轉型(upcasting)。
參閱:工程;
資源檔案,標頭檔案;
#include "resource.h"
#include /
//// menu
//idc_expdemo menu
begin
popup "&file"
begin
menuitem "c++異常處理demo", idm_exp
menuitem "e&xit", idm_exit
endpopup "&help"
begin
menuitem "&about ...", idm_about
endend
#define idm_exit 10001
#define idm_about 10002
#define idc_expdemo 10101
#define idd_aboutbox 10102
#define idm_exp 40001
C 異常處理
結構化異常 structured exception vs c 異常 c exception 大家都知道c 異常是c 語言的乙個特性,使用者可以使用throw的方式來丟擲異常,try catch 來捕獲異常。結構化異常是諸如,zero divided,access violations等異常,這些異...
c 異常處理
一 概述 c 自身有著非常強的糾錯能力,發展到如今,已經建立了比較完善的異常處理機制。c 的異常情況無非兩種,一種是語法錯誤,即程式中出現了錯誤的語句,函式,結構和類,致使編譯程式無法進行。另一種是執行時發生的錯誤,一般與演算法有關。關於語法錯誤,不必多說,寫 時心細一點就可以解決。c 編譯器的報錯...
C 異常處理
程式設計師常常忽視異常處理的重要性,這給他們自己的 造成相當大損害。本文將討論如何在c 中使用異常處理,並介紹在應用 中新增 片段以防止某些錯誤的一些簡單方法,這些錯誤可能導致程式異常終止。結構化異常處理 net框架提供一種標準的錯誤報告機制稱為結構化異常處理。這種機制依賴於應用中報告錯誤的異常。在...