尽管这个问题比较老,并且已经得到了很多答案,但是我只想添加有关如何在C ++ 11中进行适当的异常处理的注释,因为在有关异常的讨论中,我一直都缺少这个问题:
它在此处和此处的 StackOverflow上进行了描述,如何通过简单地编写适当的异常处理程序(该异常处理程序将重新抛出嵌套的异常)来获得对代码内异常的追溯,而无需调试程序或繁琐的日志记录。
由于您可以使用任何派生的异常类执行此操作,因此可以向此类回溯中添加很多信息!您也可以在GitHub上查看我的MWE,回溯显示如下:
Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"
您甚至不需要继承 std::runtime_error
抛出异常时,即可获取大量信息。
在子类化中(而不是仅使用std::runtime_error
),我看到的唯一好处是您的异常处理程序可以捕获您的自定义异常并执行一些特殊的操作。例如:
try
{
// something that may throw
}
catch( const MyException & ex )
{
// do something specialized with the
// additional info inside MyException
}
catch( const std::exception & ex )
{
std::cerr << ex.what() << std::endl;
}
catch( ... )
{
std::cerr << "unknown exception!" << std::endl;
}