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