簡體   English   中英

如何捕獲WndProc()函數中定義的靜態對象的異常?

[英]How to catch an exception for a static object defined in a WndProc() function?

如何在下面的偽代碼中捕獲靜態對象a拋出的異常,其中WndProc()是Win32 API中的標准消息處理函數?

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;
}

非POD結構的函數級靜態在第一次調用函數時初始化,您可以在try and catch包裝代碼塊try and catch並捕獲異常,就像任何正常情況一樣

你需要在WndProc中捕獲它,因為你不應該讓C ++異常“從WndProc”傳播出去。 (這適用於所有Windows回調)

如果WndProc代碼不在“你的控制之下”,你可以提供一個包裝WndProc。

您需要實現報告機制以便以后處理,例如

LRESULT CALLBACK WndProcNoX(....)
{
   try
   {
      static A a;
      ...
   }
   catch(Exception const & x)
   {
      // What do you want to happen?
      // e.g.: add x to a log, or a list of "unhandled" exceptions 
      // that you process e.g. in an Idle or OnTimer handle,
      // or make otherwise accessible.


      return 0; // (*)
   }
}

(*)是次要問題:雖然0是大多數消息的“相當安全”的返回值,但這可能導致問題,例如,當調用者要求他們需要傳遞給另一個消息的緩沖區時。 繁榮!

為了防止這種情況發生,你必須對所有單獨的處理程序進行try / catch,並為每條消息決定“如果有錯誤”返回值。

另一個選擇是在出現錯誤的情況下將消息傳遞給默認處理程序,btu也可能對某些消息有問題。

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

當然,對於除WM_CREATE之外的任何消息,如果您將使用該實例,則應仔細檢查指針是否為NULL - 以防您以意外順序獲取消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM