【发布时间】:2017-10-25 04:18:36
【问题描述】:
我的问题的简短版本
在堆栈上分配了一个类型 A 的对象。在它的析构函数 ~A() 中,有没有办法判断析构函数是否被调用是因为抛出了异常并且堆栈正在展开,还是仅仅因为定义它的范围“自然”结束?我尝试检查std::current_exception 是否不为空,不起作用。
加长版
我必须支持一个旧 API:
void MyApi()
{
try
{
MyTimeTracker mtt;
//do API stuff
}
catch(...)
{
//handle exception
}
}
如果API stuff抛出异常,表示API失败,否则表示成功。 MyTimeTracker 检查API stuff 的执行花费了多少时间——它测量构造函数中的开始时间和析构函数中的结束时间,并将其报告给数据库。
现在我希望它也报告 API 调用是否成功。有没有办法在析构函数中说明这一点?
我不允许在第一个 try 块之外分配它,因为整个 API 代码必须在 try 块中。我可以将API stuff 放入第一个内部的单独 try 块中,然后重新抛出,但这看起来很难看。
我尝试在析构函数中检查std::current_exception,但它为空,即使我们正在抛出异常。
【问题讨论】:
标签: c++ c++11 exception exception-handling