关于这个话题有很多不同意见。在我的最后一个工作,我们遇到了一些真正的问题,运行时异常被遗忘,直到他们出现在生产(在agedwards.com),所以我们决心使用检查异常。
在我目前的工作,我发现有很多人在许多或所有情况下的运行时异常。
这里是我想:使用CheckedExceptions,我被迫在编译时至少确认调用者中的异常。对于运行时异常,我不是强迫编译器,但可以编写一个单元测试,让我处理它。因为我仍然相信,早期一个bug被抓住更便宜它是修复它,我更喜欢CheckedExceptions为这个原因。
从哲学的角度来看,方法调用在某种程度上是调用者和被调用者之间的契约。由于编译器强制执行传入的参数类型,它似乎是对称的,让它强制类型的出口。也就是说,返回值或异常。
我的经验告诉我,当我使用检查异常时,我获得更高的质量,即,JUST WORKS的代码。检查的异常可能杂乱的代码,但有技术来处理这个。我喜欢在传递图层边界时翻译异常。例如,如果我从我的持久层传递,我想将一个SQL异常转换为持久化异常,因为下一层不应该关心我坚持到一个SQL数据库,但会想要知道是否有东西不能持久化。我使用的另一种技术是创建一个简单的异常层次结构。这让我把编写更清晰的代码一层,因为我可以捕获超类,只有处理各个子类,当它真的很重要。