【问题标题】:Is it necessary to create user defined exceptions for each errors是否有必要为每个错误创建用户定义的异常
【发布时间】:2016-09-08 05:40:17
【问题描述】:

我创建了一个 spring 应用程序,在其中我实现了 log4j 用于日志记录。我的应用程序中有 300 多个错误(异常)。我为每个错误创建了单独的用户定义异常。这些类除了返回错误消息什么都不做。

创建个别例外的原因:

  1. 开发人员不应错过处理任何错误情况,当我创建异常时,默认情况下会显示错误,他们必须处理以处理这种情况。
  2. 在记录时,如果我为我的错误场景创建单独的用户定义的异常,我会在浏览日志时更清楚地说明。

现在我想知道:

  1. 是否有必要为每个错误场景创建单独的用户定义异常?
  2. 大多数人如何以更好的方式处理错误和用户定义的异常?

【问题讨论】:

标签: java spring exception logging


【解决方案1】:

如果你能用一个例子更新你的问题,我会很高兴。我现在已经构建了很多企业应用程序,我通常遵循的座右铭是确保您的异常类型解释了正确的错误类别,并确保您的异常消息正确地解释了问题所在。您不应该创建自定义异常,除非需要它们来正确分类您所拥有的异常类型。这是 mabbas 的一个很好的例子:

When should we create our own java exception classes?

【讨论】:

    【解决方案2】:

    我认为您的问题无法很好地回答;这实际上是关于讨论不同的意见。我的意见:只要您的个别例外都明确定义(并且在其含义上不重叠);每个都有很好的消息,并附带您稍后调试问题所需的东西......然后:别担心。这就是异常的用途。更多(和自定义)异常还允许更具体和更精细的错误处理。

    但是如果使用异常会带来高昂的代价(在我们的环境中,我们将异常从“独立”节点 A 发送到节点 B ...现在,突然之间,您必须确保 A、B 是在匹配的代码级别上)事情是不同的。那么您可能会非常仔细地考虑,哪种架构可以为您带来最大的“投资回报”。

    【讨论】:

      【解决方案3】:

      为 300 个异常创建 300 个错误似乎有点矫枉过正。我所做的是创建我们自己的 HttpErrorException 类,其中包含我们想要返回的 HTTP 错误。建议开发人员在遇到异常或错误时抛出其中一个。如果出现不是新的HttpErrorExceptions 之一的异常,则返回 500。我们没有将其他异常转换为 HTTP 错误,因为我认为假设特定异常的每次出现都将始终映射回特定 HTTP 错误是错误的。这样做的原因是因为有很多依赖项(我们正在使用的其他库)并且它们可能会抛出任何类型的异常,对于任何特定情况,这些异常可能无法很好地映射回我们想到的 HTTP 错误。所以我宁愿明确。

      这是一个典型用法的悔恨示例。

      Account getAccount(String id){
          Account a = null;
          try{
              a = accountRepo.findById(id);
          catch(Exception e) {
              String error = "Got exception while trying to get Account from db.";
              logger.(error, e);
              throw new HttpErrorException(500, error);
              //or throw new HttpErrorException(HttpStatus.INTERNAL_SERVER_ERROR, error);
          }
          throw404IfNull(a);
          return a;
      }
      

      throwIf404IfNull 只是我们创建的一种简单方法,用于减少代码中的if 语句。我们有几个这样的方法,并且我们的代码没有if 语句,否则会进行单元测试。

      void throw404IfNull(Object obj){
          if(obj == null) {
              throw new HttpErrorException(400, "Object was not found");
          }
      }
      

      我们使用 Spring 的异常处理功能将所有 HttpErrorException 映射到格式良好的 HTTP 错误,错误状态位于异常中。

      【讨论】:

        猜你喜欢
        • 2020-07-12
        • 2012-09-23
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-25
        • 2020-03-20
        相关资源
        最近更新 更多