【问题标题】:What can I do with an std::exception_ptr other than rethrowing it除了重新抛出它之外,我还能用 std::exception_ptr 做什么
【发布时间】:2016-12-15 15:53:03
【问题描述】:

我有一个std::exception_ptr 类型的对象,我想在其上调用what(),但似乎没有办法做到这一点(如本答案所述:How do I make a call to what() on std::exception_ptr)。

在互联网上搜索后,我似乎无能为力,只能将它重新扔到std::exception& 中,以便能够做到这一点。

这对我来说有点奇怪,但我想检查一下:std::exception_ptr 可以做什么,然后重新抛出它以获得期望的细节?

C++14或其他版本的C++有什么变化

【问题讨论】:

  • 据我所知,它仅在您想推迟异常处理直到您执行其他操作时才有用。
  • 你怎么知道exception_ptr当前持有的异常实际上继承自std::exception
  • @Barry 你没有,除了重新抛出异常并试图将其捕获为std::exception&
  • @lcs 我知道 - 问题是针对 OP。

标签: c++ c++11 exception exception-handling


【解决方案1】:

很遗憾,没有。该标准仅保证std::exception_ptr

18.8.5 异常传播

1 exception_ptr 类型可用于引用异常对象。

2 exception_ptr 应满足 NullablePointer (17.6.3.3) 的要求。

3 exception_ptr 类型的两个非空值是等价的,并且当且仅当它们引用时才比较相等 同样的例外。

4 exception_ptr 的默认构造函数产生该类型的空值。

5 exception_ptr 不得隐式转换为任何算术、枚举或指针类型。

7 为了确定是否存在数据竞争,对 exception_ptr 对象的操作应 仅访问和修改 exception_ptr 对象本身,而不是它们引用的异常。

另外,注明here

对对象执行任何其他操作(例如取消引用),如果库实现完全支持,则会导致未定义的行为

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2022-01-08
    • 2012-08-15
    相关资源
    最近更新 更多