何时选择受控异常和非受控异常

2024-05-29

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

我的直觉是,如果调用者能够以某种有效的方式恢复,则需要检查异常,而对于不可恢复的情况,则需要检查异常,但我对其他人的想法感兴趣。


只要您了解何时应该使用检查异常,检查异常就很棒。 Java 核心 API 未能遵循 SQLException(有时也没有 IOException)的这些规则,这就是它们如此糟糕的原因。

检查异常应该用于可预测, but 无法避免的错误是合理恢复.

未经检查的异常应该用于其他一切。

我会为你解释一下,因为大多数人都误解了这意味着什么。

  1. 可预见但不可预防:调用者已尽其所能来验证输入参数,但某些超出其控制范围的条件导致操作失败。例如,您尝试读取一个文件,但在您检查文件是否存在和读取操作开始之间,有人将其删除。通过声明受检查的异常,您可以告诉调用者预见到这种失败。
  2. 合理恢复:告诉调用者预见他们无法恢复的异常是没有意义的。如果用户尝试读取不存在的文件,调用者可以提示他们输入新文件名。另一方面,如果该方法由于编程错误(无效的方法参数或有错误的方法实现)而失败,则应用程序无法修复执行中的问题。它能做的最好的事情就是记录问题并等待开发人员稍后修复它。

除非你抛出的异常满足all对于上述情况,应该使用 Unchecked Exception。

在每个级别重新评估:有时捕获已检查异常的方法并不是处理错误的正确位置。在这种情况下,请考虑对于您自己的呼叫者来说什么是合理的。如果异常是可预测的、不可预防的并且可以合理地从中恢复,那么您应该自己抛出一个已检查的异常。如果没有,您应该将异常包装在未经检查的异常中。如果遵循此规则,您会发现自己将检查异常转换为未检查异常,反之亦然,具体取决于您所在的层。

对于已检查和未检查的异常,使用正确的抽象级别。例如,具有两种不同实现(数据库和文件系统)的代码存储库应避免通过抛出异常来暴露特定于实现的细节SQLException or IOException。相反,它应该将异常包装在跨越所有实现的抽象中(例如RepositoryException).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时选择受控异常和非受控异常 的相关文章

随机推荐

  • 单击表格行可显示更多信息

    我正在尝试使用 jQuery 来实现以下目标 当单击一个表格行时 会显示表格行内的 info div 如果单击另一个表格行 则当前显示的任何其他 info 元素将被隐藏 并根据表格行显示新的 info div已被点击 这个问题是 代码无法正
  • 如何让 Internet Explorer 正确处理自定义协议处理程序?

    我想要打开我正在开发的网站PuTTY on ssh 0 0 0 0输入网址 我在 Chrome 和 Firefox 中使用了此功能 但在 Internet Explorer 中出现以下错误 Windows cannot access the
  • Symfony/Doctrine 重新排列数据库列

    当我使用doctrine schema update命令行生成表时 Doctrine 或Symfony 似乎想要添加一个命令来重新排列我的列 将键放在它出现的前面 我想知道是否 更希望在哪里 我可以禁用环境的这个 功能 所以当我去生成我的表
  • R:在函数中包含循环?

    以下代码可用于创建一个 data frame 其中 Kendall Tau 和 Spearman 相关结果彼此相邻 data mtcars mtcars correlation lt function x y df1 cor data fr
  • Java:BCrypt 的用途很好吗?

    我想知道我当前的 BCrypt 实现是否正确 我知道我没有使用BCrypt checkpw 这可能会导致问题 所以这是我在这里验证的主要原因 Hasher java容器类 abstract public class Hasher publi
  • PLS-00103:遇到符号“CREATE”

    这个包有什么问题 因为它给出了错误 CREATE OR REPLACE PACKAGE PKG SHOW CUST DETAILS AS PROCEDURE SHOW CUST DETAILS myArg VARCHAR2 END PKG
  • 为什么我无法在不手动编辑的情况下粘贴 Python REPL 的输出?

    大量的示例 Python 代码显示了 Python REPL 的输出 例如 gt gt gt class eg object def init self name self name name def hi self print Hi s
  • 如何使用CSS缩进多级select optgroup?

    只是试图通过嵌套深度缩进 optgroup 块 我尝试了一般margin left规则 嵌套元素然后尝试应用相同的规则 尝试过padding left 这样的缩进可能吗 看起来很简单 P 在下面的示例中 标记为 client2 a 的 op
  • 从 Json 纯 JavaScript 创建表

    我有一个带有多个可以更改的键的 Json 如下所示 Var children num 6 name me phone 7 num 8 name him phone 9 我想要一个带有标题的表格 号码 姓名 电话 我怎样才能只用 JavaSc
  • iOS 确定视频中的帧数

    如果我有一个 Swift 中的 MPMoviePlayerController MPMoviePlayerController mp MPMoviePlayerController contentURL url 有没有办法获取视频中的帧数u
  • makefile 使用目标中定义的变量[重复]

    这个问题在这里已经有答案了 如何使用 make 目标中定义的变量 PHONY foo VAR GLOBAL shell cat tmp global foo echo local gt tmp local VAR LOCAL shell c
  • 为任何更新查询增加 Mongoose 文档版本的简单方法?

    我想开始利用 Mongooses 文档版本控制 v key 我在实际增加版本值时遇到了问题 然后我发现您必须添加this increment 执行查询时 有没有办法自动递增 目前 我只是将其添加到pre用于更新类型查询的中间件 module
  • 如何使用 Apache Ant 将 Java 文件编码为 UTF-8?

    在我的 build xml 文件中 我通过 cxf 获取一些 Java 文件 其中一些 Java 文件需要使用 UTF 8 进行编码 如何使用 Ant 将编码更改为 UTF 8 PS 我找到了如何将 javac 的编码设置为 UTF 8 的
  • javascript/jquery 从选择中删除或删除选项

    在某些情况下 我需要从选择中删除选项 基本上 if mystatement true remove item with id option1 from select of id select1 有人知道我可以实现这一目标的代码吗 非常感谢
  • 为 Angular 2 配置history.pushState

    我的 Angular 2 应用程序使用默认值HTML 5 history pushState https developer mozilla org en US docs Web API History API Adding and mod
  • 在从 Postgres 9.4 到 Greenplum 的数据迁移过程中,我应该如何处理我的 UNIQUE 约束

    当我执行以下 sql 它包含在由 生成的 sql 文件中 pg dumpGreenplum 中的 Postgres9 4 CREATE TABLE public trm concept pid int8 NOT NULL code varc
  • NSString 对象的最大长度是多少?

    NSString 对象中可以保存的最大字符串大小是多少 这会动态变化吗 我假设 NSString 的硬限制是 NSUIntegerMax 个字符 因为 NSString 的索引和大小相关的方法返回 NSUInteger 由于当前能够运行 i
  • 从极坐标中的日期时间列检索日期

    目前 当我尝试从极坐标日期时间列中检索日期时 我必须写一些东西 如同 df pl DataFrame time dt datetime now df df select pl col pl col time apply lambda x x
  • xQuery LIKE 运算符?

    有没有办法以与 SQL 相同的方式使用 XQuery 执行 LIKE 操作 我不想构造一些 startswith endswith 和 contains 表达式 我想要实现的目标的示例 for x in user where x first
  • 何时选择受控异常和非受控异常

    在Java 或任何其他具有检查异常的语言 中 当创建自己的异常类时 如何决定它是否应该检查或不检查 我的直觉是 如果调用者能够以某种有效的方式恢复 则需要检查异常 而对于不可恢复的情况 则需要检查异常 但我对其他人的想法感兴趣 只要您了解何