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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用模态对话框正确使用异常处理?相关的知识,希望对你有一定的参考价值。

我对处理异常有些含糊不清:为什么我被建议不要从对话框中抛出?

这是我的尝试:

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

谢谢。

答案

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

以上是关于如何使用模态对话框正确使用异常处理?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Flash 对象正确插入模态 HTML 对话框

有没有办法在对话框片段前面打开一个导航抽屉

Qt如何使用模态(exec())实现等待效果,并同时进行其他操作?(先显示等待,再进行其他操作!)

如何使用 MFC 从控制台正确弹出无模式对话框

如何在 pytest-qt 中处理模态对话框而不模拟对话框

模态窗口和控件显示前后