【问题标题】:How to return correct results and list of errors [closed]如何返回正确的结果和错误列表 [关闭]
【发布时间】:2012-10-29 12:42:27
【问题描述】:

我对以下方法的设计感到困惑:

Map<String, BigDecimal> foo(Parameter p){ ... }

此方法采用复杂的Parameter 并返回地图名称 -> 值。在许多情况下,基于参数的某些基础计算,生成的地图将是相同的,此外,只有少数不同的地图可以返回,因此这些地图将被缓存。但是,最初创建地图时,可能存在不同类型的错误 - 某些字符串值可能不正确,某些值可能

【问题讨论】:

  • 同样缓存异常,并在调用 foo() 时抛出它。
  • 缓存异常是什么意思?我想返回正确的结果,以便处理它们。如果我抛出异常,那么调用者方法将无法做到这一点
  • 我不确定我是否明白这一点。如果生成了结果,我认为调用者没有理由知道已经处理了一个内部异常。
  • 可能没有任何“例外” - 只是要标记的东西
  • 无论你称它们为“异常”还是“错误标志”,都是一样的。不过,对于非错误标志,它可能是有意义的。在这种情况下,我会有一个方法 getFlagXYZ()。

标签: java error-handling


【解决方案1】:

这是一个相当不寻常的要求——如果你可以生成一个有效的结果,尽管有内部错误,你可能应该返回那个结果;如果不是,则抛出异常。

但是,如果您确实想返回此附加信息,那么我认为您有两种选择:

  1. 面向对象的可变状态。当您运行foo() 时,在某个字段中累积任何内部错误。公开一个额外的getFooErrors() 方法以允许调用者检查发生了什么。如果您需要告诉调用者这些错误对结果图质量的影响程度,还可以使用getFooErrorSeverity() 方法。
  2. 不可变/功能性。作为您方法的一部分,从上面返回信息(例外情况,可能还有严重性评分)。与其返回Map&lt;String, BigDecimal&gt;,不如返回一个包含映射以及异常详细信息的对象。例如:

    public class FooResult {
        public final Map<String, BigDecimal> result;
        public final List<Throwable> errors;
        public final int errorSeverity;
    
        // Constructor elided
    }
    

第一种方法类似于java.io.PrintWriter 在标准库中的工作方式。它吞下其 I/O 方法遇到的任何 IOExceptions,并公开一个 checkError() 方法以允许调用者查看编写器是否遇到任何异常。

我更喜欢第二种,因为它不会影响线程安全,它会预先为客户端提供所有信息,并且与遇到错误的范围巧妙地结合在一起。

【讨论】:

    【解决方案2】:

    没有一种正确的方法可以做到这一点,但是创建一个包含您的地图和错误列表的特殊类FooResult 怎么样(尽管我宁愿将其称为警告,因为通常会报告不可恢复的错误与异常) ,例如:

    FooResult foo(Parameter p){ ... }
    
    class FooResult {
      Map<String, BigDecimal> result;
      List<Error> errors;
    }
    

    其中Error 可以是一个包含您需要的所有错误信息(例如代码、消息、异常等)的类,例如:

    class Error {
      int code;
      String message;
      Throwable cause; // optional, depending on error
      // ...
    }
    

    或者,Errors 的列表可以作为参数传递,并在必要时由方法填充,例如:

    Map<String, BigDecimal> foo(Parameter p, List<Error> errors) { 
      ... 
      if (error) {
        errors.add(new Error(10, "Bad error"));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2017-10-05
      • 1970-01-01
      相关资源
      最近更新 更多