提升rethrow_exception引发不同类型的异常
Boost rethrow_exception throws exception of different type
我正在使用Boost exception_ptr
,并观察到rethrow_exception(ptr)
并没有给我原始的异常。我已经把它煮成这个:
struct error : virtual std::exception, virtual boost::exception {};
try {
boost::exception_ptr ptr(boost::copy_exception(error()));
boost::rethrow_exception(ptr);
}
catch(boost::exception& e) {
// e is a boost::exception_detail::clone_impl<error>
}
e
不应该是error
型而不是clone_impl
型吗?
我正在使用 Boost 1.49.0。
这是设计使然。
请参阅 http://www.boost.org/doc/libs/1_55_0/libs/exception/doc/frequently_asked_questions.html"为什么 boost::异常抽象?
boost::exception 的类型是抽象的,以防止用户"重新抛出"它。如果用户想要重新抛出,她被迫使用类似的代码
catch( boost::exception & e )
{
e << foo_info(foo);
throw; //Okay, re-throwing the original exception object.
}
你也可以从不同的角度看待这个问题。客户错误类型几乎可以是任何东西,它可能不允许从中派生,或者可能是不可复制或根本不可构造的(例如,只有朋友才能访问的私人构造函数)。因此,Boost 不能假设任何关于客户类型的信息,不能从中复制或派生/复制,只能保留指向传递给boost::copy_exception
的现有对象的指针。
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 您应该在什么时候创建自己的异常类型
- 如何处理具有无效数据类型的异常
- 当我尝试访问结构类型时,我收到 std::bad_variant_access 异常
- E/libc++abi:终止于类型为google::protobuf::FatalException的未捕获异常
- 当没有浮点数据类型时,为什么此代码会出现浮点异常
- 是否可以检查给定exception_ptr实例是否拥有某种类型的异常?
- 为什么标准不允许通过引用捕获不完整的异常类型?
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 为什么内置类型的对象上的溢出会导致异常/未定义的行为?
- 当构造函数的参数类型错误时引发异常
- 如何抛出"template parameter"类型的异常?
- 为什么可以指定异常规范的参数类型
- 提出异常并处理C 的某些异常类型的正确方法是什么?
- 异常处理期间的类型解析
- std:任何抛出异常解析函数类型
- CRTP 模式 但是在数据结构中存储非同构类型
- 正在重新处理C++或C++11中的类型异常