2009-07-08 47 views
12

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

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

另一项建议(即从一个评论,而不是答案出来)是始终重新抛出ThreadDeath

任何其他最佳做法?

+2

`ThreadDeath`也应该被重新抛出,但不应该抛在第一位。 – 2009-07-08 11:54:40

+0

为什么发表评论,这只是我想要的答案类型? – ripper234 2009-07-08 13:40:49

回答

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

+1永远不会吞下检查的异常 - 即使是在你的第一关。这些事情往往被忽略,最终被提交到源代码控制。如果有疑问,至少要打印堆栈跟踪。 – akf 2009-07-08 11:53:18

+0

如果你不能处理它并且不能重新抛出它,至少要打印堆栈跟踪!日志中的堆栈跟踪对诊断问题很有帮助。 – starblue 2009-07-08 11:53:36

2

取决于你在做什么。

,如果你正在开发一个API,由另外一个人,它能够更好地重新抛出异常或者包装到你的自定义异常,并抛出使用。

鉴于如果您正在开发一个最终用户应用程序,您需要处理此异常并执行必要的操作。

1

如果你正在写一个调度队列,然后由当时的例外还是回到你身边有一个在做任何事的不是记录它的其他没有任何意义。 Swing事件队列基本上具有这种类型的行为。

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

至于InterruptedException的云:那在乎的只是您的调度循环,这应该检查一些外部的状态,看它是否应该停止处理。

2

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