gpt4 book ai didi

c++ - 我可以修改 std::exception_ptr 中异常的值吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:01 29 4
gpt4 key购买 nike

如果我在 std::exception_ptr 中存储了一个异常。我使用 std::rethrow_exception 重新抛出异常,使用 catch(MyException&) 访问它,然后修改值。

如果我再次抛出相同的异常,我是否应该观察我所做的修改?

下面的代码展示了我的想法:

#include <exception>
#include <iostream>

struct MyException {
int value;
};

int main() {
std::exception_ptr a = std::make_exception_ptr(MyException());

try {
std::rethrow_exception(a);
} catch(MyException& b) {
std::cout << b.value << std::endl;
b.value = 3;
}

try {
std::rethrow_exception(a);
} catch(MyException& b) {
std::cout << b.value << std::endl;
}
}

最佳答案

您的代码符合规范且可移植。但是这里有龙:

  • 如果您通过 current_exception() 获得您的 exception_ptr,则不确定您是获得对当前异常的拷贝的引用,还是对当前异常本身。即使您连续两次调用 current_exception(),您也可能会或可能不会获得对同一异常对象的引用。

  • 由于 exception_ptr 是可复制的,并且拷贝可能指向同一个异常对象,而 rethrow_exception 不会复制,两个线程很可能同时抛出同一个异常对象。因此在多线程程序中,很难知道您是否对 catch 子句中的异常具有唯一访问权限。对该异常的修改可能会产生数据竞争。数据竞争可能存在于某些平台上,而不存在于其他平台上,这取决于 current_exception() 是否进行复制。

所以如果你必须在多线程程序中修改异常对象,最安全的做法是先复制它,修改拷贝,然后重新抛出拷贝(如果需要的话)。

更新

对不起,我给错了答案。

使用:http://webcompiler.cloudapp.net示例代码的输出是:

0
0

rethrow_exception 的 VS 实现似乎复制了异常。

Clang 和 gcc 不复制。

关于c++ - 我可以修改 std::exception_ptr 中异常的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30580128/

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