【问题标题】:How to properly use exception handling iwth modal dialogs?如何在模态对话框中正确使用异常处理?
【发布时间】:2017-12-25 22:47:36
【问题描述】:

我在处理异常方面有些模糊:为什么建议我不要从对话框中抛出?

这是我的尝试:

wndproc 中是这样的:

    case WM_COMMAND:
        switch(LOWORD(wparam)){
            case IDD_ABOUT:{
                try{
                    int ret = DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_ABOUT), hwnd, AboutDlgProc);
                    if(ret == IDOK)
                        MessageBox(hwnd, "Dialog exited with IDOK.", "Notice",MB_OK | MB_ICONINFORMATION);
                    else
                        if(ret == IDCANCEL)
                            MessageBox(hwnd, "Dialog exited with IDCANCEL.", "Notice",MB_OK | MB_ICONINFORMATION);
                    else 
                    if(ret == -1)
                        MessageBox(hwnd, "Dialog failed!", "Error",MB_OK | MB_ICONINFORMATION);
                }
                catch(char *pError){
                    MessageBox(NULL,pError,"Error",MB_OK);
                //  EndDialog(hwnd, IDOK);
                }
                catch(...){
                    MessageBox(NULL,"Something went wrong!","Error",MB_OK);
                //  EndDialog(hwnd, IDOK);
                }
            }
        break;
        case ID_EXIT:
            DestroyWindow(hwnd);
        break;
    }
    break;

在我的模态对话框过程中,如果单击按钮获取输入时输入错误,我会抛出:

// In AboutDlgProc:

//...
case IDOK:
    GetInputFromEditBox; // creating buffer and reading text and blahblah
    if(not_good_input)
        throw "Bad input"; // 

我知道使用更强大的处理是使用层次结构并继承自std::exception...但这里仅用于练习。

  • 这是我应该怎么扔的吗?或者我应该以其他方式做吗?应该取消注释上面的行吗? // EndDialog(hwnd, IDOK);?

谢谢。

【问题讨论】:

  • 您的代码看起来不错。可能建议您不要从对话框过程中抛出,因为您不能让任何异常从您的代码退出回到调用您的 wndproc 的 MS-Windows 代码中。 MS-Windows 代码是C,不知道如何处理 C++ 异常、堆栈展开等。
  • @RichardCritten:谢谢。您介意添加答案吗?
  • @RichardCritten:但我想我是从我的对话框程序中抛出的 Richard? throw "Bad input";?
  • 这往往会在 64 位版本的 Windows 上的 wow64 模拟器中运行的 32 位代码上以失败告终。通过 64 位窗口管理器展开堆栈,从 32 位到 64 位再回到 32 位,这是一个他们不知道如何正确解决的问题。更糟糕的结果是在 Win7 上,异常完全消失。更高版本重新引发 SEH 异常。它是documented,但没有人知道它是什么意思。这意味着“不要这样做”。
  • @HansPassant:感谢您的链接。

标签: c++ winapi exception-handling modal-dialog


【解决方案1】:

除了 Richard 关于堆栈展开的评论之外,还有一个更根本的问题,即 DialogBox 创建一个 HWND 并停用父窗口,如果您抛出异常,则创建的 HWND 不会被破坏并且父窗口不会得到重新启用。

【讨论】:

  • 加1.加个例子。
猜你喜欢
  • 1970-01-01
  • 2018-04-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多