根据[1],
“在决定检查异常与未检查异常时,问问自己,当异常发生时客户端代码可以采取什么行动?如果客户端代码不能做任何事情,请将其设为未检查异常。如果客户端代码将采取一些有用的根据异常中的信息进行恢复操作,使其成为受检异常。”
我得到了整体的想法。但是,我的困惑是,“客户端代码”是什么意思。假设我正在编写一个 REST API,它有一个调用实际后端层的服务层(我也在其中进行验证)。
API User --calls--> { |Service Layer| --internally calls--> |Backend Layer| }
- 那么API用户也被认为是“客户端代码”?
- 对于请求验证,我应该抛出 Checked 还是 Unchecked Exceptions?
- 避免使用检查异常的最佳做法是什么?
- 是否可以在验证中抛出未经检查的异常,让它冒泡,然后在服务层的自定义异常中捕获和包装它?(并使用 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