1。)什么样的异常记录是更好的做法?
//1 xor //2
2。)这个问题语言是否具体? (最感兴趣的是c ++)
代码:
:: LOG是singleton-logger的宏
struct myExc : virtual std::runtime_error
{
myExc( std::string const&msg )
:runtime_error(msg)
{
LOG << msg; //1
}
};
void foo_throw()
{
throw myExc("");
}
/// some_where
...
try()
{
foo_throw();
}
catch( myExc const& e)
{
LOG << e.what(); //2
}
catch(...
答案 0 :(得分:3)
第二种变体是首选,因为调用堆栈中的某些代码可以选择捕获异常而不输出错误。在第一个版本中,一旦创建了异常就会输出,从而减少了捕获代码的选择。
例如,你可能会这样做:
try
{
foo_throw();
}
catch (myExc& e)
{
//do some recovery
}
如果您的异常构造函数输出了某些内容,则在捕获所述异常时无法执行任何操作。
答案 1 :(得分:0)
第一个可能“过于聪明”。你确定LOG <<
不能抛出异常吗?在第二种情况下,您有更多的信息和更多的可能性来考虑如果LOG <<
抛出会发生什么,特别是您可以在日志之前做必须安全的事情。
第一个案例尝试做两件事:通知异常和日志消息。这是不好的。在第二种情况下,您只通知异常,然后处理它:做东西和记录。
第二种情况是责任分离的例子,其中一个班级执行一项任务。
此外,您的异常类不受logger的依赖,这也是很好的东西。