使用时boost::exception
,知道异常携带什么数据的首选方法是什么?在boost 文档中,给出了以下示例:
catch( io_error & e )
{
std::cerr << "I/O Error!\n";
if( std::string const * fn=get_error_info<file_name>(e) )
std::cerr << "File name: " << *fn << "\n";
if( int const * c=get_error_info<errno_code>(e) )
std::cerr << "OS says: " << strerror(*c) << "\n";
}
这似乎有点尴尬,特别是如果异常通过很多层冒泡并且理论上有大量可用的元数据。所以我想记录每个异常类的可能错误信息是有意义的。然后我可能还需要一些函数的文档,关于异常中可能包含哪些信息。最后,我觉得我在文档中具有完全相同的结构,如果我只是使用类似以下结构的东西,我会在代码中拥有:
struct FileException {
string* filename; // NULL or string
}
然后我可以在 catch 块中更改此信息:
catch (FileException& e) {
e.filename = filename;
throw;
}
这种简单的方法可以让我绕过大部分文档,并从所有安全性中获益(例如,不尝试从 获取文件名MathException
)。然而人们使用boost。我缺少的动态方法有很大的优势吗?您如何在代码中记录错误信息?