需要一个强大的错误系统的Win32 gui应用程序

我有一些代码,如下所示:

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)来自动closures进度条。 只有成功完成后,用户才可以点击“确定”。
  • MYCLASS_ERRORenum一个值,它包含各种返回types和状态。

我发现单击SomeDialog确定,错误信息仍然显示! 我挖得更深一点,发现MYCLASS_ERROR = IDOK = 1。

所以我的问题是,我应该如何定义所有这些返回状态,使它不会与任何其他实现的状态相冲突? 意思是,我的函数应该返回不是由其他函数返回的值(或尽可能less的其他函数)。

我想修改我的devise,使所有的function只返回TRUE或FALSE。 但是,这在所有情况下都是不可行的。 我也search了很多答案,到目前为止还没有find答案。

感谢您的期待!

有办法解决这个问题,但他们有点难看。

最干净的设计通常是避免与标准的Win32成语相冲突的设计,在Win32的世界中,模式对话框返回一个ID值来指示用户点击它们时按下的按钮(就像消息框一样)。 严格来说,它是传递给EndDialog函数的nResult参数,用于关闭模式对话框。

我建议不要试图用额外的含义来重载这个返回值。 试图这样做只会让你陷入困境(例如,你可能没有注意到返回值-1意味着创建对话框失败)。

相反,在对话框类中定义一个额外的成员变量,并用它来报告你的附加信息。 成功后,您将从对话框返回IDOK 。 失败( 任何一种失败),返回像IDCANCELOnButtonClick代码将检查返回值是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