在Java中捕获Throwable的最佳实践

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

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

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

还有其他最佳做法吗?

可能最重要的是, 永远不要吞下一个经过检查的例外 。 我的意思是不要这样做:

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

除非那是你想要的 。 有时人们会吞下已检查的exception,因为他们不知道如何处理这些exception,或者不想(或不能)通过“抛出exception”子句来污染他们的界面。

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

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

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

 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 */ } } 

取决于你在做什么。

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

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

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

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

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

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