我有一个类使用 RAII 进行清理,以防出现问题。这意味着该类包含一个标志,告诉它工作是否已完成,如果在调用构造函数时未设置此标志,则它正在执行它的清理任务并产生日志消息。现在我希望这个类变得更加聪明,即它应该找出错误是否发生,因为工作被中止(即抛出异常并且调用了析构函数)或者因为有人滥用这个类并且永远不会实际上完成了工作。这意味着我必须在析构函数中找出异常是否处于活动状态。如果找到一个,我会生成一条日志消息,可能会打印异常的内容,然后重新抛出它。我猜是这样的。
Foo::~Foo () {
try { /* do not know what to put here */ }
catch( const std::exception & ex ) {
// produce error in log
throw;
}
catch( ... ) {
// produce some other log message
throw;
}
}
但是我不确定这是否会起作用,因为异常在调用析构函数之前已经处于活动状态并且不是源自try
块。另外,我throw;
在析构函数内部使用了一个,此时抛出异常是一个非常糟糕的主意。所以我不会这样做,除非标准明确保证这种情况是这个规则的例外(不是双关语)(我不知道)。
那么这有可能吗,还是我应该以其他方式处理这种情况?