c++ - 如何正确使用模态对话框的异常处理?

标签 c++ winapi exception modal-dialog

我对处理异常有一些歧义:为什么建议我不要从对话框中抛出异常?

这是我的尝试:

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);?

谢谢。

最佳答案

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

关于c++ - 如何正确使用模态对话框的异常处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47972514/

相关文章:

java - 如何在try和catch block 的return语句之后打印finally block 中的语句?

C++ 模板函数无匹配调用

c++ - 设置引用c++

c++ - 让 QtConcurrent 中的 QTimer 正常工作

c++ - ADL 未选取带有模板参数列表的后缀表达式

c++ - 如何在 C++ winapi 中获取加载图标的大小

javascript - 将脚本标签插入 DOM 时捕获 SyntaxError 异常

c - 适用于 Windows 的 UTF-8 到 UTF-16 API 包装器库?

winapi - Richedit 2.0 在 WM_SETTEXT 后撤消

java - 灰熊 Jersey 吞咽异常