我对处理异常有一些歧义:为什么建议我不要从对话框中抛出异常?
这是我的尝试:
在 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/