2012-04-24 38 views
3

如何在下面的僞代碼中捕獲靜態對象a引發的異常,其中WndProc()是Win32 API中的標準消息處理函數?如何捕獲在WndProc()函數中定義的靜態對象的異常?

class A 
{ 
    public: 
    class Exception{}; 
    A() throw(Exception) { ... } 
}; 

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam) 
{ 
    static A a; 

    switch(message) 
    { 
     case WM_CREATE: 

     ... 

     break; 

     ... 

     default: 

     return DefWindowProc(hwnd, message, wParam, lParam); 
    } 
    return 0; 
} 
+0

不要引發在窗口過程中無法處理的異常。消息循環sorta中的支持工作,但很麻煩。當您在64位版本的Windows上運行32位進程時,Windows傾向於吞噬異常。 – 2012-04-24 13:49:48

+0

使用靜態指針,初始化爲NULL,並在調用WM_CREATE時創建類實例。 – 2012-04-26 02:58:09

+0

謝謝。如果你回答這個問題,我很樂意接受它。 – Belloc 2012-04-26 14:21:50

回答

0

使用靜態指針,初始化爲NULL,並在調用WM_CREATE時創建類實例。

當然,對於除WM_CREATE以外的任何消息,如果您要使用實例,則應該仔細檢查指針是否爲NULL - 以防萬一您以意外的順序收到消息。

1

功能級靜態非POD結構intialized第一次函數調用時你可以用代碼塊的try and catch和捕獲異常像任何正常情況下

+0

我發現這種方法存在問題。要中止窗口創建,推薦的過程是在WM_CREATE中返回-1。我怎樣才能在catch子句中做到這一點? – Belloc 2012-04-24 14:05:08

+0

@ user1042389爲什麼不在'catch子句'中返回-1會是一個問題? – keety 2012-04-24 14:11:58

+0

是的,這將是一個問題,因爲您將爲WM_CREATE以外的消息返回-1。 Windows在WM_CREATE之前向WndProc()發送幾條消息。 – Belloc 2012-04-24 14:15:27

1

你需要趕上在WndProc中,因爲你不應該讓C++異常傳播出WndProc。 (這適用於所有Windows回調)

如果WndProc代碼不是「在您的控制下」,則可以提供包裝WndProc。

您需要實現報告機制以供日後處理,例如, (*)是第二個問題:雖然對於大多數消息來說0是「相當安全」的返回值,但這可能會導致問題,例如,當呼叫者請求緩衝區的緩衝區時,他們需要傳遞給另一個消息。繁榮!

爲了防止這種情況發生,您必須在所有單個處理程序周圍放置一個try/catch,併爲每個消息決定「出現錯誤」返回值。

另一種選擇是將消息傳遞給默認處理程序以防出現錯誤,btu也可能對某些消息有問題。

+0

我發現這種方法存在問題。要中止窗口創建,推薦的過程是在WM_CREATE中返回-1。我怎樣才能在catch子句中做到這一點? – Belloc 2012-04-24 14:08:36

+0

@ user1042389正確更改'return'語句。 – 2012-04-24 14:11:10

+0

我認爲任何來自catch子句的返回都會在WM_CREATE消息發送到WndProc()之前發生。 – Belloc 2012-04-24 14:18:53

相關問題