我们是否应该总是捕获异常,将其包装并传递给它?

时间:2011-02-08 10:49:00

标签: exception-handling

我读过这样的方法:

public void doSomething throws MyException{
    ...
    try {
         doSomthingElse();
    } catch (MyException e){
         log.errer(e.getMessage());
         throw new MyException(e.getMessage(),e);
    }
    ...
}

但我更愿意:

public void doSomething throws MyException{
     ...
     doSomthingElse();         
     ...
}

任何人都知道第一种方法有什么原因吗?只有一种类型的Exception,它没有在这个方法中处理,有没有理由去捕获它,没有新信息包装它,然后传递它?为什么不以第二种方式写它?谢谢!

5 个答案:

答案 0 :(得分:5)

记录异常并将其进一步抛出实际上是几个reasons的反模式。经验法则是:如果你不能做任何有用的事情来处理异常(在大多数情况下,日志记录是而不是处理异常),让你的框架/容器为你做。如果可以(例如,当数据库不可用时使用不同的存储,在网络关闭时使用队列包),请记录异常并继续(始终记住也记录堆栈)。

如果您有一个已检查的异常,请将其包装在运行时1中并重新抛出(创建自定义异常或查找符合您需要的现有异常)。

答案 1 :(得分:2)

这取决于类之间的关系。一般来说,我更喜欢将日志记录委托给调用者。通常是知道如何处理异常的调用者:重试?通知用户?登录?忘记?

Misko Hevery is a good read关于这个问题。

答案 2 :(得分:1)

在您的示例中,这个“包装器”的原因可能不是永远错过一个异常,至少记录它。在catch块中我没有看到任何其他意义,因为那些通常被声明为从异常中恢复并且可能进行“正确清理”。

我更喜欢从现有异常继承自定义异常类。

在新异常的构造函数中,进行日志记录。这样,我将节省生成另一个具有完整跟踪的新异常的开销,以及其他开销。

答案 3 :(得分:0)

除了想要记录异常或用“本地”做其他事情外,我没有看到任何理由。

答案 4 :(得分:0)

您可能希望捕获并记录发生的特定错误,以便更好地记录,但是通过抛出新的Exception在更高级别处理它。