使用已检查的异常与使用REST API的未经检查的异常

时间:2017-03-19 02:28:02

标签: java exception checked-exceptions unchecked-exception

根据[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用户显示)
  5. 参考文献:

    [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

1 个答案:

答案 0 :(得分:4)

  

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

  

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

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

  

问题3:避免使用已检查的例外是最佳做法吗?

没有

  

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

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

如果将所有内容都转换为未经检查的异常,则编译器无法帮助您检查是否应处理了应该处理的异常。

在您的模型中,某些东西必须从客户端API的调用者处理那些不需要处理的错误。它可以完成......但是你更依赖于API客户端程序员来知道什么是正确的事情。如果没有经过检查的异常,他/她就可以简单地忽略异常......直到它们导致系统测试失败,生产失败。

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