何时选择“检查”和“未检查”异常

何时选择“检查”和“未检查”异常

在Java(或任何有检查异常的其他语言)中,当创建自己的异常类时,如何决定是否应该检查它?

我的直觉是,在调用者可能能够以某种有效的方式恢复的情况下,会调用一个检查过的异常,而对于无法恢复的情况,作为一个未检查的异常,我会对其他人的想法感兴趣。


喵喔喔
浏览 400回答 3
3回答

胡子哥哥

检查异常是很好的,只要您理解什么时候应该使用它们。对于SQLException(有时对于IOException),Java核心API未能遵循这些规则,这就是它们如此糟糕的原因。检查异常应用于可预测,但是不可预防错误合理地从.未经检查的异常应该被用来做其他的事情。我来帮你解释一下,因为大多数人都误解了这意味着什么。可预测但不可预防:调用方在其能力范围内尽一切努力验证输入参数,但某些超出其控制范围的条件导致操作失败。例如,您尝试读取一个文件,但在您检查文件是否存在和读取操作开始之间,有人会删除它。通过声明一个已检查的异常,您将告诉调用方预测此失败。合理地从:没有必要让来电者预测他们无法恢复的例外情况。如果用户试图从不存在的文件中读取,调用方可以提示他们输入新的文件名。另一方面,如果该方法由于编程错误(无效的方法参数或错误的方法实现)而失败,则应用程序无法在执行过程中修复该问题。它所能做的最好就是记录问题并等待开发人员稍后修复它。除非你抛出的异常全对于上述条件,它应该使用未经检查的异常。重新评估各级:有时捕获检查异常的方法不是处理错误的正确位置。在这种情况下,考虑什么对你自己的来电者是合理的。如果异常是可预测的、不可预防的和合理的,那么您应该自己抛出一个检查过的异常。如果没有,则应将异常包装为未经检查的异常。如果您遵循此规则,您将发现自己将检查的异常转换为未检查的异常,反之亦然,这取决于您所在的层。对于已检查和未检查的异常,使用正确的抽象级别..例如,具有两个不同实现(数据库和文件系统)的代码存储库应该避免公开特定于实现的详细信息,方法是引发SQLException或IOException..相反,它应该将异常封装在一个跨越所有实现的抽象中。RepositoryException).

红糖糍粑

从…Java学习者:当异常发生时,您必须捕获并处理异常,或者通过声明您的方法抛出该异常来告诉编译器无法处理该异常,那么使用您的方法的代码将不得不处理该异常(即使它也可能选择声明它在无法处理异常时抛出异常)。编译器将检查我们是否做了这两件事中的一件(捕获或声明)。这就是所谓的检查异常。但是,编译器不会检查错误和运行时异常(即使您可以选择捕获,或者声明,它并不是必需的)。因此,这两个被称为未检查的异常。错误用于表示在应用程序之外发生的情况,例如系统崩溃。运行时异常通常是由于应用程序逻辑中的错误而发生的。在这种情况下你什么也做不了。当出现运行时异常时,您必须重写程序代码。因此,编译器不会检查这些内容。这些运行时异常将在开发和测试期间发现。然后,我们必须重构代码以删除这些错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java