如何正确捕获CDatabase::Close抛出的异常 合规实现方案咨询
针对CDatabase类异常捕获方案的解答
核心结论
- 你当前在
CPTSDatabase析构函数中使用catch(...)捕获所有异常的写法在当前场景下是合理的,不要被通用的「catch(...)属于不良设计」的结论束缚:通用语境下反对
catch(...)是因为正常业务流程中吞掉所有异常会隐藏故障根因、提升排查成本,但析构函数默认携带noexcept标识,一旦有异常逃出析构函数会直接触发std::terminate导致程序崩溃,阻止异常从析构函数抛出是C++的通用最佳实践。 CDatabase::Close确实会抛出异常:官方文档未提及属于遗留文档的疏漏,你跟踪的源码中CATCH_ALL捕获异常后执行了THROW_LAST(),已经明确说明该方法会向外抛出MFC异常类型。- C++11的
current_exception机制不适用于当前场景:该特性主要用于跨线程/异步场景传递异常对象,你当前仅需在析构中拦截异常避免崩溃,无需额外保存异常后续重抛,完全不需要引入该机制。
优化建议
你当前的实现仅存在一个可优化点:空的catch(...)块会完全隐藏CloseDatabase的执行故障,建议补充日志记录逻辑,优化后代码参考如下:
CPTSDatabase::~CPTSDatabase() { try { CloseDatabase(); } catch(...) { // 此处补充错误日志,记录数据库关闭失败的上下文信息 LogError("CPTSDatabase析构时关闭数据库失败"); } } void CPTSDatabase::CloseDatabase() { if (m_dbDatabase.IsOpen()) m_dbDatabase.Close(); }
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

