我正在整合boost::exception
到现有代码中。部分代码现在使用BOOST_THROW_EXCEPTION
,但有些人可能仍然会抛出标准std::exception
.
我想在中间捕获站点添加 error_info。根据文档,如果异常是boost::exception
,我可以这样做:
try {
do_something()
}
catch( boost::exception & e ) {
e << boost::errinfo_file_name(file_name);
throw;
}
但这只会将信息添加到增强异常中。我想将其添加到std::exception
以及。最干净的方法是什么?这是一种方法,但会导致一些代码重复:
try {
do_something()
}
catch( boost::exception & e ) {
e << boost::errinfo_file_name(file_name);
throw;
}
catch( std::exception & e ) {
throw enable_error_info(e) << boost::errinfo_file_name(file_name);
}
是否有一种方法相当于“将当前异常作为增强异常,或者如果不是,则从中创建增强异常”?
EDIT: boost::enable_error_info()
有点这样做,但返回原始异常的副本,它切掉了boost::exception
我捕获的异常的一部分。例证:
int main()
{
try {
try {
BOOST_THROW_EXCEPTION( std::runtime_error( "foo" ) );
}
catch( std::exception & e ) {
std::cerr << e.what() << std::endl; // "foo"
if( const char* const* function = boost::get_error_info<boost::throw_function>(e) ) std::cerr << *function << std::endl; // "int main()"
throw boost::enable_error_info(e) << boost::errinfo_file_name("bar");
}
}
catch( std::exception & e ) {
std::cerr << e.what() << std::endl; // "std::exception"
if( const char* const* function = boost::get_error_info<boost::throw_function>(e) ) std::cerr << *function << std::endl; // NOTHING
}
return 0;
}
EDIT: 我尝试使用boost::current_exception()
,它也会把东西切掉。基本上,任何复制异常的尝试都会因为多重继承引起的切片而丢失一些数据。与文档说您应该始终重新抛出的原因相同throw
代替throw e
. So I really除非有必要,否则不想进行任何复制。
理想情况下,我想写以下内容,其中current_exception_as_boost_exception()
如果当前异常已经是一个,则返回对当前异常的引用boost::exception
,否则返回调用结果boost::enable_error_info
on it.
try {
do_something()
}
catch( std::exception & e ) {
throw current_exception_as_boost_exception() << boost::errinfo_file_name(file_name);
}
是这样吗boost::enable_current_exception
是为了?确实不清楚它的目的是什么,并且任何教程中都没有使用它。