我读过这样的方法:
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,它没有在这个方法中处理,有没有理由去捕获它,没有新信息包装它,然后传递它?为什么不以第二种方式写它?谢谢!
答案 0 :(得分:5)
记录异常并将其进一步抛出实际上是几个reasons的反模式。经验法则是:如果你不能做任何有用的事情来处理异常(在大多数情况下,日志记录是而不是处理异常),让你的框架/容器为你做。如果可以(例如,当数据库不可用时使用不同的存储,在网络关闭时使用队列包),请记录异常并继续(始终记住也记录堆栈)。
如果您有一个已检查的异常,请将其包装在运行时1中并重新抛出(创建自定义异常或查找符合您需要的现有异常)。
答案 1 :(得分:2)
这取决于类之间的关系。一般来说,我更喜欢将日志记录委托给调用者。通常是知道如何处理异常的调用者:重试?通知用户?登录?忘记?
Misko Hevery is a good read关于这个问题。
答案 2 :(得分:1)
在您的示例中,这个“包装器”的原因可能不是永远错过一个异常,至少记录它。在catch
块中我没有看到任何其他意义,因为那些通常被声明为从异常中恢复并且可能进行“正确清理”。
我更喜欢从现有异常继承自定义异常类。
在新异常的构造函数中,进行日志记录。这样,我将节省生成另一个具有完整跟踪的新异常的开销,以及其他开销。
答案 3 :(得分:0)
除了想要记录异常或用“本地”做其他事情外,我没有看到任何理由。
答案 4 :(得分:0)
您可能希望捕获并记录发生的特定错误,以便更好地记录,但是通过抛出新的Exception在更高级别处理它。