C 異常處理Demo win32 版

2021-10-23 16:53:02 字數 2801 閱讀 2292

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框架提供一種標準的錯誤報告機制稱為結構化異常處理。這種機制依賴於應用中報告錯誤的異常。在...