向异常添加数据

Adding data to an exception

我有一个要处理项目列表的用例。处理不是原子的,它可能对列表中的某些项目成功而对其他一些项目失败。我想告知 API 的用户,对于列表中的某些项目,处理失败。我有 3 个选项:

  1. Return 包含成功项目的列表

  2. Return 包含失败项目的列表

  3. 抛出异常说明某些项目失败

如果我采用第 3 种方法并且仍然想让客户知道处理失败的项目,我可以向异常添加一个列表 class 并让客户在他们需要时阅读此列表得到一个例外?这是可取的吗?这里还有什么可以做的吗?

异常 class 如下所示:

@Getter @Setter
public class SomeProcessingException extends Exception {
  private static final long serialVersionUID = 1L;
  private List<SomeItem> failedItems;

  public SomeProcessingException(String message) {
    super(message);
  }
}

是的,您可以扩展 Exception 并添加失败项的 List,就像您已经做的那样。

部分:

still want to let the clients know the items for which the processing failed

您的客户是什么?最终用户?还是使用您的库的程序员?管理员?

如果是程序员,他可以抓住你的 SomeProcessingException 并从中获取失败项目列表​​。

如果查看日志的是最终用户(例如管理员),则必须重写 SomeProcessingExceptiontoString 方法。

如果它是使用客户端(浏览器、android phone、桌面应用程序...)的最终用户,您必须拦截 SomeProcessingException 并显示弹出窗口或类似内容从中提取失败的项目。


许多标准异常提供对其内部属性的访问,这些属性可由 class 的用户使用,例如 URISyntaxException has the method getIndex() 到:

Returns an index into the input string of the position at which the parse error occurred, or -1 if this position is not known.

SQLException has the method getErrorCode类似:

Retrieves the vendor-specific exception code for this SQLException object.