记录和包装异常。这是一个好习惯吗?

时间:2011-02-23 19:08:52

标签: java

你认为将所有服务方法包装在try catch块中以记录这样的异常是否值得:

public void attachClean(Car instance) {
    log.info("attaching clean Car instance");
    try {
        getSessionFactory().getCurrentSession().lock(instance, LockMode.NONE);
        log.info("attach successful");
    } catch (RuntimeException re) {
        log.error("attach failed", re);
        throw re;
    }
}

似乎很多打字

7 个答案:

答案 0 :(得分:5)

您通常会记录或重新抛出,但不能同时记录和重新抛出。上层可能能够处理异常状态,并且在这种情况下不需要记录整个堆栈跟踪。 Hovewer,如果您确定要确保记录,您可以自己登录。多次记录异常比在日志文件中缺少重要异常要好。

答案 1 :(得分:4)

这是一种可怕的练习。除了更多的输入之外,你什么都没做,可能是日志中的重复堆栈跟踪以及几个额外的测试线。如果这是一个RuntimeException并且你无论如何都无法处理它(记录!=处理),只要让它飞得更高,也许有人能够正确处理它(框架/容器最好)。\

BTW可以练习总是记录你工作的某种上下文,所以你可能想要写一些像(SLF4J方言)的东西:

log.info("attaching clean Car: {}", instance);
getSessionFactory().getCurrentSession().lock(instance, LockMode.NONE);
log.info("{} attach successful", instance);

答案 2 :(得分:1)

想想如果一切都这样,日志会是什么样子。然后想想如果没有人会怎么样。

您需要合理的平衡。例如,如果您正在创建API,则可能需要将保留库的内容记录到用户代码中。

答案 3 :(得分:1)

您可以让像Spring这样的依赖注入框架通过将其配置为使用AOP proxies来装饰您的类来实现繁重的工作。链接的示例显示了如何使用它进行授权检查,但日志记录非常相似。

答案 4 :(得分:1)

在我看来......不。

如果您正在捕获异常并相应地处理请求,例如执行一些清理,则是另一回事。但是,如果你只是尝试捕获只是为了记录错误,那么它没有意义。毕竟,运行时异常的堆栈跟踪将告诉您异常发生的位置。你可以在最顶端做一个“全能”,而不是在整个地方进行试试。

如果你真的偏执,你可以使用AspectJ的“around”建议来执行集中的“try-catch-log-error”块。这比使用那些几乎没有任何功能的丑陋try catch块污染代码要好得多。

答案 5 :(得分:0)

如果您的方法attachClean是您系统外部接口的一部分,那么日志记录是非常的..否则,您对客户收到的例外情况没有任何线索。

如果此方法是系统内部实施的一部分,则无需进行日志记录。因为异常将由您的外部接口处理。

答案 6 :(得分:0)

我不会重新抛出异常。你必须再次捕获它,添加更多的样板代码。而且,try中的代码更慢。