【问题标题】:Using Checked Exceptions vs Unchecked Exceptions with REST APIs通过 REST API 使用已检查的异常与未检查的异常
【发布时间】:2017-03-19 02:28:02
【问题描述】:

根据[1],

“在决定检查异常与未检查异常时,请询问 自己,当异常发生时,客户端代码可以采取什么行动 发生?如果客户端代码无法执行任何操作,请将其设为未选中 例外。如果客户端代码需要一些有用的恢复 根据异常中的信息采取行动,使其成为选中状态 例外。”

我明白了整体的想法。但是,我的困惑是,“客户端代码”是什么意思。假设我正在编写一个 REST API,它有一个调用实际后端层的服务层(我也在其中进行验证)。

API User --calls--> { |Service Layer| --internally calls--> |Backend Layer| }
  1. 那么 API 用户也被视为“客户端代码”?
  2. 对于请求验证,我应该抛出 Checked 还是 Unchecked Exceptions?
  3. 是避免使用检查异常的最佳做法吗?
  4. 是否可以在验证中抛出未经检查的异常,让它冒泡,并在服务层的自定义异常中捕获和包装它? (并使用 JAX-RS ExceptionMapper [3] 向 API 用户展示)

参考资料:

[1]http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html

[2]http://archive.oreilly.com/pub/post/avoiding_checked_exceptions.html

[3]https://docs.oracle.com/javaee/6/api/javax/ws/rs/ext/ExceptionMapper.html

【问题讨论】:

  • REST API 用户是使用 HTTP 访问服务的客户端,对吧?因此,Java 的异常语义在这种情况下是无关紧要的——如果发生故障,客户端只会收到 HTTP 错误代码。

标签: java exception checked-exceptions unchecked-exception


【解决方案1】:

Q1:那么 API 用户也被视为“客户端代码”?

是的。

Q2:对于请求验证,我应该抛出 Checked 还是 Unchecked Exceptions?

引用您问题中的建议:“如果客户端代码无法执行任何操作,请将其设为未经检查的异常。如果客户端代码将根据异常中的信息采取一些有用的恢复操作,请将其设为检查异常。”

Q3:避免使用检查异常的最佳做法是什么?

没有。

Q4:是否可以在验证中抛出未经检查的异常,让它冒泡,并在服务层的自定义异常中捕获并包装它? (并使用 JAX-RS ExceptionMapper [3] 向 API 用户展示)

“可以吗”取决于你问的是谁。这还取决于它是否适合您。

如果您将所有内容都变成未经检查的异常,那么编译器无法帮助您检查应该处理的异常是否已处理。

在您的模型中,必须将需要由客户端 API 调用者处理的错误与不需要处理的错误区分开来。可以做到……但是您更依赖 API 客户端程序员知道什么是正确的事情。如果没有检查异常,他/她可以简单地忽略异常......直到它们导致系统测试失败,生产失败。

你的程序员有多好?你的文档有多好?您的质量控制/测试制度有多好?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多