有时候,你只需抓住Throwable,例如在编写调度程序队列时调度通用项并需要从任何错误中恢复(所述调度程序记录所有捕获的异常,但是静默地,然后继续执行其他项)。
我能想到的一个最佳实践是,如果它是InterruptedException,则总是重新抛出异常,因为这意味着有人打断了我的线程并想要杀死它。
另一个建议(来自评论,而不是答案)是要始终重新考虑ThreadDeath
还有其他最佳做法吗?
答案 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而言:唯一关心的是你的调度循环,它应该检查一些外部状态,看它是否应该停止处理。