我正在将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;
}
但这只会将信息添加到boost异常中。我希望也将其添加到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);
}
有没有一种方法相当于“将当前异常作为boost异常给我,或者如果它不是boost异常,则创建一个boost异常”?
编辑: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;
}
编辑: 我尝试使用boost::current_exception()
, 但它也会导致异常数据被截断。因为多重继承导致的切片,任何复制异常的尝试都会丢失一些数据。这也是为什么文档中说您应该始终使用throw
而不是throw e
来重新抛出异常的原因。所以,除非必要,我真的不想产生任何复制。
理想情况下,我希望编写以下代码,其中current_exception_as_boost_exception()
如果当前异常已经是boost::exception
,则返回对其的引用,否则将其传递给boost::enable_error_info
的结果。
try {
do_something()
}
catch( std::exception & e ) {
throw current_exception_as_boost_exception() << boost::errinfo_file_name(file_name);
}
< p >那么< code >boost::enable_current_exception< /code >是用来做什么的呢?它的目的非常不清楚,而且在任何教程中都没有使用。< /p >
enable_error_info()
能够工作,但它是“过度”的。既然异常通常不应该发生,因此性能并不真正成问题,那么过度的部分有什么关系呢? - John Zwinckboost :: copy_exception()
(我假设这就是enable_error_info()
使用的东西)可能会在过程中丢失类型信息(请参阅http://stackoverflow.com/questions/9973499/why-do-i-lose-type-information-when-using-boostcopy-exception)。 因此,除非我有一些保证,即enable_error_info()
不会删除任何内容,否则我宁愿避免复制。 - user1924406