登录异常构造函数是不是很糟糕?

时间:2015-04-30 11:03:22

标签: c++ exception logging

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(...

2 个答案:

答案 0 :(得分:3)

第二种变体是首选,因为调用堆栈中的某些代码可以选择捕获异常而不输出错误。在第一个版本中,一旦创建了异常就会输出,从而减少了捕获代码的选择。

例如,你可能会这样做:

try
{
    foo_throw();
}
catch (myExc& e)
{
    //do some recovery
}

如果您的异常构造函数输出了某些内容,则在捕获所述异常时无法执行任何操作。

答案 1 :(得分:0)

第一个可能“过于聪明”。你确定LOG <<不能抛出异常吗?在第二种情况下,您有更多的信息和更多的可能性来考虑如果LOG <<抛出会发生什么,特别是您可以在日志之前做必须安全的事情。

第一个案例尝试做两件事:通知异常和日志消息。这是不好的。在第二种情况下,您只通知异常,然后处理它:做东西和记录。

第二种情况是责任分离的例子,其中一个班级执行一项任务。

此外,您的异常类不受logger的依赖,这也是很好的东西。

相关问题