关于异常处理反模式的文章(参见:https://today.java.net/article/2006/04/04/exception-handling-antipatterns),Log和Return Null是一种反模式。给出的原因是“不是返回null,抛出异常,让调用者处理它。您应该只在正常(非例外)用例“
中返回null根据文章,下面的代码是一个糟糕的编程实践和反模式
catch (NoSuchMethodException e) {
LOG.error("Blah", e);
return null;
}
catch (NoSuchMethodException e) {
e.printStackTrace();
return null;
}
我要求更多解释。我可以理解为什么只返回null是一个反模式,因为它吞下了永远丢失信息的异常。但是使用LOG.error(" Blah",e);和e.printStackTrace();,信息被记录或打印,不会丢失 - 那么为什么它是反模式?
答案 0 :(得分:3)
调用者不会获得有关发生错误的其他语义信息,也不会发生错误。他们传递了错误的输入吗?在这种情况下,给他们一个以客户为中心的错误(这将在RPC或其他类型的远程调用中更好地转换)。一些依赖的上游服务是否消失了?抛出语义异常,以便调用者可以向用户提供有用的反馈(例如,"数据库不可用。请致电帮助台...")。 null
使得无法以有意义的方式回应错误 - 它只是成为了所有错误"发生错误"。
答案 1 :(得分:0)
引用的文章将异常和空用法的使用混为一谈。通常吞咽异常是一种反模式。但是,在某些情况下,如果catch块通过其他方式提供信息或副作用,则这是一种有效的方法。例如,代码可以为访问者创建异常处理程序。此外,如果没有人抓住它,抛出异常是没有意义的。是否存在这种情况?