嵌套异常和原始类型

时间:2014-02-25 00:43:12

标签: c++ c++11

当捕获的异常是原始类型时,我可以使用std::throw_with_nested吗?

据说,新类型派生自捕获的异常和新异常。但我不能从像int这样的原始类型派生出来。因此,我不能使用基本类型的嵌套异常。这是真的吗?

3 个答案:

答案 0 :(得分:1)

我的标准副本说:

  

18.8.6 / 7 引发:如果U是不是从nested_exception派生的非联合类类型,则为未指定的例外从Unested_exception公开派生并由std::forward<T>(t)构建的类型,否则为std::forward<T>(t)

因此throw_with_nested(42) throw 42;

答案 1 :(得分:1)

标准说明throw_with_nested(T && t)U = remove_reference<T>::type

  

抛出:如果U是不是从nested_exception派生的非联合类类型,则是从U公开派生的未指定类型的例外和nested_exception并由std::forward<T>(t)构建,否则为std::forward<T>(t)

&#34;否则&#34;条款似乎说如果你没有类型,你只需抛出原始论点。

答案 2 :(得分:1)

抛出的异常是从 new 异常和std::nested_exception派生的未指定类型(不是新的和捕获的)。然后std::nested_exception包含std::exception_ptr到捕获的异常(从std::current_exception获得)。

所以:

如果例外是int,那么您会抛出int,因为其他答案已经说明了。

如果您捕获 int,那么您将int中抛出的std::nested_exception抛出(从中派生的类型)新异常。