在Java中捕获Throwable的最佳实践

时间:2009-07-08 11:36:00

标签: java exception throwable

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

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

另一个建议(来自评论,而不是答案)是要始终重新考虑ThreadDeath

还有其他最佳做法吗?

4 个答案:

答案 0 :(得分: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 */ }
}

答案 1 :(得分:2)

取决于你正在做什么。

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

然而,如果您正在开发最终用户应用程序,则需要处理此异常并完成所需的操作。

答案 2 :(得分:2)

OutOfMemoryError(或者它的超类VirtualMachineError)怎么样?我无法想象在一些严肃的事情之后你能做多少事情。

答案 3 :(得分:1)

如果您正在编写一个调度程序队列,那么当异常返回给您时,除了记录它之外,没有必要对它进行任何操作。 Swing事件队列基本上具有这种行为。

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

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