gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:29:04 39 4
gpt4 key购买 nike

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

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

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/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com