【问题标题】:Exception Handling Anti-patterns: Why log and return null is an anti-pattern异常处理反模式:为什么记录并返回 null 是反模式
【发布时间】:2014-07-08 04:01:35
【问题描述】:

一篇关于异常处理反模式的文章提到(参考:https://today.java.net/article/2006/04/04/exception-handling-antipatterns)Log and 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();,信息被记录或打印并且不会丢失——那为什么它是一个反模式呢?

【问题讨论】:

  • 您的来电者在哪里?如果是远程调用或网络服务呢?
  • 你正在吃掉失败的原因,你的客户永远不会知道为什么这个方法调用失败了......它只是失败了!!!!!!
  • 你以前有没有为自己以外的人写过代码?
  • 我或多或少同意这篇文章,但我不知道“你应该只在正常(非异常)用例中返回 null”的含义。在正常情况下,您将返回一个非空值。这种双重思维在异常恐惧症中似乎太常见了。作者现在假设或暗示三种场景:异常、正常但返回空值,以及正常且不返回空值。生活通常没有那么复杂。

标签: java exception-handling


【解决方案1】:

调用者没有得到关于发生什么错误以及发生原因的额外语义信息。他们是否传递了错误的输入?在这种情况下,给他们一个以客户端为中心的错误(这将在 RPC 或其他某种远程调用中更好地转换)。是否有一些依赖的上游服务消失了?抛出语义异常,以便调用者可以向用户提供有用的反馈(例如,“数据库不可用。请致电帮助台...”)。 null 使得无法以有意义的方式响应错误 - 它只是成为“发生错误”的全部内容。

【讨论】:

    【解决方案2】:

    引用的文章将异常的使用和 null 的使用混为一谈。一般来说,吞下异常是一种反模式。但是,在某些情况下,如果 catch 块通过其他方式提供信息或副作用,则它是一种有效的方法。例如,代码可以为访问者创建异常处理程序。此外,如果没有人捕获异常,则抛出异常是没有意义的。是否存在这种情况?

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 2017-05-17
      • 2020-07-16
      • 2010-11-02
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多