根据 [1],
"在决定检查异常与未检查异常时,询问 你自己,当异常时客户端代码可以采取什么操作 发生?。如果客户端代码无法执行任何操作,请将其设置为未选中 例外。如果客户端代码需要一些有用的恢复 根据异常中的信息执行的操作,使其成为已检查 例外。
我明白总体想法。但是,我的困惑是,"客户端代码"是什么意思。假设我正在编写一个 REST API,它有一个调用实际后端层的服务层(我也在其中进行验证)。
API User --calls--> { |Service Layer| --internally calls--> |Backend Layer| }
- 那么API用户也被认为是"客户端代码"吗?
- 对于请求验证,我应该抛出"已检查"还是"未选中的异常"?
- 最佳做法是避免使用已检查的异常吗?
- 是否可以在验证中抛出未经检查的异常,让它冒泡,并在服务层的自定义异常中捕获并包装它? (并使用 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
Q1:所以API用户也被认为是"客户端代码"?
是的。
Q2:对于请求验证,我应该抛出已检查还是未选中的异常?
引用您问题中的建议:">如果客户端代码无法执行任何操作,请将其设置为未经检查的异常。如果客户端代码将根据异常中的信息采取一些有用的恢复操作,请将其设置为已检查的异常。
问题 3:最佳做法是避免使用检查异常吗?
不。
Q4:是否可以在验证中抛出未经检查的异常,让它冒泡,并在服务层的自定义异常中捕获并包装它?(并使用 JAX-RS ExceptionMapper [3] 向 API 用户展示这一点)
"可以吗"取决于你问谁。 这也取决于它是否适合您。
如果将所有内容都转换为未经检查的异常,则编译器无法通过检查是否处理应处理的异常来帮助您。
在您的模型中,某些内容必须从不需要由客户端 API 的调用方处理的错误中找出来。 可以做到...但是你更依赖于 API 客户端程序员知道什么是正确的事情。 如果没有检查异常,他/她可以简单地忽略异常......直到它们导致系统测试失败,生产失败。
你的程序员有多好? 您的文档有多好? 你们的质量控制/测试制度有多好?