有没有一种方法可以判断程序正在抛出异常
Is there a way to tell that the program is in process of throwing an exception?
我的问题的简短版本
堆栈上分配了一个类型为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块中的一个单独的try块,然后重新throw,但这看起来很难看。
我尝试在析构函数中检查std::current_exception
,但它为null,即使我们正在抛出异常。
没有标准的可移植方法可以像您描述的那样检测堆栈展开的状态。
但有一个更简单的解决方案。向MyTimeTracker
添加一个布尔成员,如果API成功,则设置该成员,然后在析构函数中检查该成员。
MyTimeTracker::MyTimeTracker()
{
...
success = false;
}
MyTimeTracker::~MyTimeTracker()
{
...
if (!success) {
...
}
}
void MyApi()
{
try
{
MyTimeTracker mtt;
//do API stuff
mtt.success = true;
}
catch (...)
{
//handle exception
}
}
更新:
执行这些操作的主要原因是报告异常上的错误代码。
然后您必须求助于第二个try/catch
来获取错误代码,将其存储在mtt
对象中以在析构函数中执行操作,然后重新抛出:
MyTimeTracker::MyTimeTracker()
{
...
errCode = 0;
}
MyTimeTracker::~MyTimeTracker()
{
...
if (errCode != 0) {
...
}
}
void MyApi()
{
try
{
MyTimeTracker mtt;
try
{
//do API stuff
}
catch (const the_api_error &e)
{
mtt.errCode = ...; // error code from e...
throw;
}
}
catch (...)
{
//handle exception
}
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- 如何判断Microsoft打印到 PDF 打印机驱动程序何时完成
- 有没有一种方法可以判断程序正在抛出异常
- 如何判断 WIN32 C++ 应用程序在 CTRL-ALT-DEL 之后是否失去了焦点
- 有什么方法可以判断分叉/执行Qt应用程序的主窗口何时显示?
- (视觉工作室)如何判断 c++ 程序的哪些部分运行,哪些部分未运行?
- 简单的程序可以判断数字是偶数还是奇数,负片都显示为偶数
- 如何通过CPP判断其他程序的结果?
- 如何判断在InstallShield安装程序中包含哪个c++可重新发布版本
- 如何判断屏幕保护程序是否在Qt (C/ c++)程序中运行?Windows (MS)
- 程序在c++中判断一个数字是整数还是浮点数
- 通过c++判断一个程序是否安装在Linux中