c++ - 从模式对话框中抛出异常的最佳做法是什么?

标签 c++ exception atl

我有一个显示模型对话框并等待用户做某事的函数,但是,它很复杂并且可能出错,在这种情况下会抛出异常。

这里是使用异常处理调用这个函数的假定代码:

try {
    CMyDialog mydialog();
    mydialog.DoModal();
}
catch(std::logic_error &e){
    DoExceptionHandling();
}

对话框 UI 是用 ATL 编写的,让我们假设有一个按钮 OnClick 处理程序如下:

LRESULT CMyDialog::OnBnClickedBlah(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/){
    ...
    throw std::logic_error("BlahBlah");
}

然而,当运行上述代码时,一旦抛出异常,在 Debug模式下我触发了一个 ATL 断言,该断言声称对话框的 HWND 应该为空(但实际上尚未清除)。

我想知道的是如何解决这个问题并允许调用者捕获异常,并确保所有资源都已正确释放?

最佳答案

一些建议:

我会尽量不跨消息边界抛出异常,尤其是不同模式的消息循环。有几个中间层,即使它起作用(在这种情况下似乎不起作用),也是在自找麻烦。

我建议您对错误使用 EndDialog,并在对话框类本身中存储某种错误代码,调用者可以检查对话框中的“意外”结果代码(例如:IDCANCEL)。这样对话框仍然会在出现错误时“消失”,所有内容都可以正确清理,并且您不必担心确保所有内容都适用于非标准对话框错误处理。我的 2c。

关于c++ - 从模式对话框中抛出异常的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9678426/

相关文章:

c++ - 如何理解和修复这段代码中的段错误?

c++ - 在 SVM opencv c++ 中标记数据

c++ - ATL/WTL 是否仍然需要使用全局 _Module 变量?

c++ - 我应该如何在 ATL 项目中创建类?

c++ - 模板特化 - clang 和 gcc 的不同结果

c++ - 如何转发声明自定义unique_ptr

scala - 两个异常 "at the same time",处理这种情况的正确方法是什么?

c++ - 如何在DLL内的成员函数中使用互斥锁/关键部分

ios - UITableViewCell 内的 UICollectionView 断言失败

c# - 关闭表单时的 StackOverflow