12

有时,您只需要捕获 Throwable,例如,在编写调度通用项目并需要从任何错误中恢复的调度程序队列时(所述调度程序记录所有捕获的异常,但静默,然后在其他项目上继续执行)。

我能想到的一个最佳实践是,如果异常是 InterruptedException,则总是重新抛出异常,因为这意味着有人打断了我的线程并想要杀死它。

另一个建议(来自评论,而不是答案)是总是重新抛出ThreadDeath

还有其他最佳实践吗?

4

4 回答 4

12

可能最重要的是,永远不要吞下已检查的异常。我的意思是不要这样做:

try {
  ...
} catch (IOException e) {
}

除非那是你的意图。有时人们会吞下已检查的异常,因为他们不知道如何处理它们,或者不想(或不能)用“抛出异常”子句来污染他们的界面。

如果您不知道如何处理它,请执行以下操作:

try {
  ...
} catch (IOException e) {
  throw new RuntimeException(e);
}

另一个想到的是确保您处理异常。读取文件应如下所示:

FileInputStream in = null;
try {
  in = new FileInputStream(new File("..."));;
  // do stuff
} catch (IOException e) {
  // deal with it appropriately
} finally {
  if (in != null) try { in.close(); } catch (IOException e) { /* swallow this one */ }
}
于 2009-07-08T11:38:29.837 回答
2

取决于你在做什么。

如果您正在开发供其他人使用的 API,最好重新抛出异常或将其包装到您的自定义异常中并抛出。

而如果您正在开发最终用户应用程序,则需要处理此异常并做必要的事情。

于 2009-07-08T11:39:34.500 回答
2

OutOfMemoryError(或者它的超类 VirtualMachineError)呢?我无法想象在这么严重的事情之后你可以做很多事情。

于 2011-03-17T10:36:06.100 回答
1

如果您正在编写调度程序队列,那么当异常返回给您时,除了记录它之外,对它做任何事情都没有意义。Swing 事件队列基本上具有这种类型的行为。

或者,您可以为“未捕获的异常处理程序”提供一个挂钩,类似于ThreadGroup。请注意,处理程序可能需要很长时间,并最终延迟您的调度程序。

就 InterruptedException 而言:唯一关心的是您的调度循环,它应该检查一些外部状态以查看它是否应该停止处理。

于 2009-07-08T11:51:10.387 回答