[英]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_ERROR
是enum
的值,包含各種返回類型和狀態。 我發現在SomeDialog
單擊“確定”時,仍會顯示錯誤消息! 我挖了一點,發現MYCLASS_ERROR
= IDOK
= 1。
所以我的問題是,我應該如何定義所有這些返回狀態,以便它不會與任何其他實現的狀態發生沖突? 意思是,我的函數應返回任何其他函數(或盡可能少的其他函數)不返回的值。
我想改變我的設計,使所有函數只返回TRUE或FALSE。 但是,這在所有情況下都不可行。 我也搜索了很多答案,到目前為止還沒有找到任何答案。
謝謝你的期待!
有辦法解決這個問題,但它們有點難看。
最干凈的設計通常是避免與標准Win32慣用語沖突的設計,在Win32的世界中,模態對話框返回一個ID
值,以指示用戶在解除它們時單擊的按鈕(就像消息框一樣)。 嚴格地說,它是傳遞給用於關閉模態對話框的EndDialog
函數的nResult
參數。
我建議不要嘗試使用其他含義重載此返回值。 試圖這樣做會讓你遇到麻煩(例如,你可能還沒有注意到返回值為-1意味着對話框的創建失敗)。
而是在對話框類中定義一個額外的成員變量,並使用它來報告您的其他信息。 成功后,您將從對話框中返回IDOK
。 失敗( 任何類型的失敗),返回IDCANCEL
類的東西。 然后,您在OnButtonClick
代碼將檢查返回值是否為IDOK
或IDCANCEL
。 如果它是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.