gpt4 book ai didi

c++ - 有没有办法告诉程序正在抛出异常?

转载 作者:行者123 更新时间:2023-11-27 23:50:21 25 4
gpt4 key购买 nike

我的问题的简短版本

栈上分配了一个 A 类型的对象。在它的析构函数 ~A() 中,有没有办法判断析构函数被调用是因为抛出异常并且堆栈正在展开,还是仅仅因为定义它的范围“自然”结束?我尝试检查 std::current_exception 是否不为空,不起作用。

更长的版本

我有一个必须支持的旧 API:

void MyApi()
{
try
{
MyTimeTracker mtt;
//do API stuff
}
catch(...)
{
//handle exception
}
}

如果API stuff抛出异常,说明API失败,否则说明成功。 MyTimeTracker 检查执行 API 东西 需要多少时间 - 它测量构造函数中的开始时间和析构函数中的结束时间,并将其报告给数据库。

现在我希望它也报告 API 调用是否成功。有没有办法在析构函数中告诉它?

我不允许在第一个 try block 之外分配它,因为整个 API 代码必须在 try block 中。我可以将 API 内容 放入第一个 block 内的单独 try block 中,然后重新抛出,但这看起来很难看。

我尝试在析构函数中检查 std::current_exception,但它是空的,即使我们正在抛出异常也是如此。

最佳答案

没有像您描述的那样检测堆栈展开状态的标准可移植方法。

但是有一个更简单的解决方案。在MyTimeTracker中添加一个boolean成员,如果API成功则设置它,然后在析构函数中检查它。

MyTimeTracker::MyTimeTracker()
{
...
success = false;
}

MyTimeTracker::~MyTimeTracker()
{
...
if (!success) {
...
}
}

void MyApi()
{
try
{
MyTimeTracker mtt;
//do API stuff
mtt.success = true;
}
catch (...)
{
//handle exception
}
}

更新:

the main reason for doing all that is to report back the error code, which sits on the 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
}
}

关于c++ - 有没有办法告诉程序正在抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46923919/

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