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

Ani*_*amy 5 c++ windows error-handling mfc

我有一些代码如下:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)
  • SomeDialog只显示一个进度条.如有任何错误,进度条将通过调用自动关闭EndDialog(MYCLASS_ERROR).只有在成功完成后,才允许用户点击"确定".
  • MYCLASS_ERROR是一个enum包含各种返回类型和状态的值.

我发现单击确定后SomeDialog,仍然显示错误消息!我挖得更深,发现MYCLASS_ERROR= IDOK= 1.

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

我想改变我的设计,使所有函数只返回TRUE或FALSE.但是,这在所有情况下都不可行.我也搜索了很多答案,到目前为止还没有找到任何答案.

谢谢你的期待!

Cod*_*ray 3

有很多方法可以解决这个问题,但它们有点丑陋。

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

我建议不要尝试用额外的含义来重载此返回值。尝试这样做只会给您带来麻烦(例如,您可能没有注意到返回值 -1 意味着对话框的创建失败)。


相反,请在对话框类中定义一个附加成员变量,并使用它来报告附加信息。成功后,您将从IDOK对话框中返回。失败时(任何类型的失败),返回类似IDCANCEL. 然后,您的代码OnButtonClick将检查返回值是否为IDOKor 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.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)