簡體   English   中英

需要一個強大的錯誤系統來win32 gui應用程序

[英]need a robust error system for a win32 gui application

我有一些代碼如下:

void MyClass::OnButtonClick()
{
    int retVal = SomeDialog.DoModal();
    if(retVal == MYCLASS_ERROR)
    {
        MessageBox("Error"...blah ...blah);
    }
    else if(retVal == IDOK)   // IDOK is returned on clicking the 'OK' button
    {
        MessageBox("All is well"...blah ...blah);
    }
}
  • SomeDialog只顯示一個進度條。 在任何錯誤上,通過調用EndDialog(MYCLASS_ERROR)自動關閉進度條。 只有在成功完成后,才允許用戶點擊“確定”。
  • MYCLASS_ERRORenum的值,包含各種返回類型和狀態。

我發現在SomeDialog單擊“確定”時,仍會顯示錯誤消息! 我挖了一點,發現MYCLASS_ERROR = IDOK = 1。

所以我的問題是,我應該如何定義所有這些返回狀態,以便它不會與任何其他實現的狀態發生沖突? 意思是,我的函數應返回任何其他函數(或盡可能少的其他函數)不返回的值。

我想改變我的設計,使所有函數只返回TRUE或FALSE。 但是,這在所有情況下都不可行。 我也搜索了很多答案,到目前為止還沒有找到任何答案。

謝謝你的期待!

有辦法解決這個問題,但它們有點難看。

最干凈的設計通常是避免與標准Win32慣用語沖突的設計,在Win32的世界中,模態對話框返回一個ID值,以指示用戶在解除它們時單擊的按鈕(就像消息框一樣)。 嚴格地說,它是傳遞給用於關閉模態對話框的EndDialog函數的nResult參數。

我建議不要嘗試使用其他含義重載此返回值。 試圖這樣做會讓你遇到麻煩(例如,你可能沒有注意到返回值為-1意味着對話框的創建失敗)。


而是在對話框類中定義一個額外的成員變量,並使用它來報告您的其他信息。 成功后,您將從對話框中返回IDOK 失敗( 任何類型的失敗),返回IDCANCEL類的東西。 然后,您在OnButtonClick代碼將檢查返回值是否為IDOKIDCANCEL 如果它是IDCANCEL ,那么您需要查詢添加到對話框中的成員變量的值以獲取其他信息。

希望這是有道理的。 如果沒有,也許這個代碼示例將(假設m_errStatus是您添加到CDialog的子類中的成員變量):

void MyClass::OnButtonClick()
{
    if (SomeDialog.DoModal() == IDOK)
    {
        // Success!
        // The OK button was clicked, so IDOK was returned.
        MessageBox("All is well"...blah ...blah);
    }
    else
    {
        // Failure!
        // Some error occurred, so IDCANCEL (or any other value) was returned.
        // Determine what to do now, based on additional information that the
        // dialog set upon failure.
        switch (SomeDialog.m_errStatus)
        {
            case MYCLASS_ERROR_1:
                MessageBox("Error 1 occurred.");
                break;
            case MYCLASS_ERROR_2:
                MessageBox("Error 2 occurred.");
                break;
            // etc.
        }
    }
}

您可以簡單地定義自定義錯誤代碼,使其不與Windows返回值“沖突”。 當然,你不知道微軟什么時候會添加新的返回值,所以這總是有點松懈。

你可以嘗試這樣的事情:

enum MYERR
{
    MYERR_FIRST_ERROR   = 0x0F000000, /* large and unlikely to be used */
    MYERR_SECOND_ERROR,
    MYERR_THIRD_ERROR,
    /* and so on */
};

但是,正如Cody Gray上面所說,我認為你最好從DoModal返回一個標准錯誤代碼,例如IDABORT而不是像這樣重載返回代碼。 然后只需要一個用戶必須顯式檢索的二級錯誤代碼,這是您自己的“內部”錯誤代碼。

您可以使用枚舉而不是宏定義的返回碼,使用命名空間以避免名稱沖突。 看看Boost錯誤處理政策

namespace boost { namespace math { namespace policies {

enum error_policy_type
{
   throw_on_error = 0, // throw an exception.
   errno_on_error = 1, // set ::errno & return 0, NaN, infinity or best guess.
   ignore_error = 2, // return 0, NaN, infinity or best guess.
   user_error = 3  // call a user-defined error handler.
};

}}} // namespaces

暫無
暫無

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

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