总的来说,我有很多天被人们扔掉这样的异常所浪费。
我建议遵循一些基本规则,但有例外:
如果您绝对确定您永远不会导致检查异常出现问题,请捕获该异常并准确注释您不需要处理它的原因。(Sleep 会抛出一个 InterruptedException,除非你真的对它感兴趣,否则它总是可以被忽略,但老实说,这是我通常忽略的唯一情况——即使那样,如果你从来没有得到它,那么记录它的成本是多少?)
如果您不确定,但您可能偶尔会得到它,请捕获并记录堆栈跟踪,以便在它导致问题时可以找到它。同样,只捕获您需要的异常。
如果您看不到任何可以抛出已检查异常的方式,请捕获它并将其作为未检查异常重新抛出。
如果您确切知道是什么导致了异常,捕获它并准确记录原因,如果您非常清楚导致它的原因,那么在这种情况下您实际上不需要堆栈跟踪(并且您可能会提到记录它的类,如果你还没有使用 log4j 什么的。
听起来你的问题属于最后一类,对于这种捕获,永远不要做你写的事情(异常 e),总是做特定的异常,以防抛出一些未经检查的异常(错误的参数,空指针, ...)
更新:这里的主要问题是 Checked Exceptions 不好。它们存在的唯一高度使用的语言是Java。它们在理论上很整洁,但实际上它们会导致这种捕获和隐藏的行为,而未经检查的异常是不会出现的。
很多人评论说,我说有时隐藏它们是可以的。具体来说,我能想到的一种情况是:
try {
Thread.sleep(1000);
catch (InterruptedException e) {
// I really don't care if this sleep is interrupted!
}
我想我觉得这种用法没问题的主要原因是因为这种 InterruptedException 的使用首先是对检查异常模式的滥用,它传达的睡眠结果不仅仅是指示异常条件。
拥有以下内容会更有意义:
boolean interrupted=Thread.sleep(1000);
但是当他们第一次创建 Java 时,他们为他们新的检查异常模式感到非常自豪(可以理解,它在概念上非常简洁——只是在实践中失败了)
我无法想象另一种可以接受的情况,所以也许我应该将其列为可以忽略异常的唯一情况。