如何使用异常处理完全停止执行?

时间:2020-06-11 11:40:40

标签: java exception

public boolean validateInfo(Item item) throws Exception {
    StringBuilder errors = new StringBuilder();
    errors.append(Validator.validateCommonInfo(flexPayload))
          .append(Validator.validateSpecificInfo(flexPayload))
    if(errors.length() > 0) {
        throw new Exception(errors.toString());
    }
    return true;
}

以上代码来自我正在处理的项目。我正在解析多个项目,如果它们不包含适当的信息,我想抛出异常并停止一起解析所有项目。通过抛出throw new Exception(errors.toString());,我认为这将终止整个过程。这不是目前正在发生的事情。我的单元测试已经通过,但是我在其他地方发现了一个错误,这清楚表明异常并未完全停止解析。在这里处理异常处理的最佳方法是什么?如果有错误,我不会进行任何解析。

1 个答案:

答案 0 :(得分:0)

通过抛出抛出新的Exception(errors.toString());我认为这将终止整个过程。

您为什么这么认为?抛出异常只会通过“返回”该异常而导致当前的方法退出。

异常的目的是传达操作可能失败的信息,从而使调用代码既可以了解此情况,又可以解决此问题(例如,重试,后备,采用计划B,要求用户提供更多信息)输入等)。

实际上,根据您示例中的名称,这正是应该正在发生的情况。一些代码希望确保item有效,因此它调用您的validateItem()方法进行检查。在正常情况下,一切都很好,但在例外情况下,则存在问题-因此,调用代码可以处理该问题(例如,通过将400个响应代码返回给HTTP客户端;通过显示一个向用户说明错误并询问错误的对话框)他们可以更正;通过决定不继续进行缓存更新并保留先前的Item;或其他基于其所做的相关操作。

为了响应无效的Item,绝对不应该执行整个过程。 尤其是不在此级别。即使您确实出于某种原因需要终止该进程,也应该在您的main()方法(或类似的容器的顶层生命周期方法)的顶层执行此操作。

所以要回答您明确的问题“我如何完全停止执行”:该方法的调用者本身应引发异常,以指示它无法成功执行 任务(由于到无效的Item)。并且 its 调用者应该抛出一个异常,以指示更广泛的操作失败,等等,一直到栈顶。这些可以通过捕获并包装您的初始异常而被明确抛出,也可以根本无法捕获您的异常并使之冒泡。

其他问题

  1. 您的validateInfo()方法返回boolean。因此,我认为从其签名中假设,如果true有效,则该方法将返回Info,否则将返回false。抛出异常反而违反了最小惊讶原则。如果在这种情况下真的需要抛出异常,请让方法返回void-缺少异常将表示有效输入。
  2. 您要抛出(并声明要抛出)一个普通的java.lang.Exception对象。由于Exception位于非常大的类层次结构的顶部,因此它也包括所有其他形式的异常,这意味着调用者无法确定该异常是由于无效项引起的,而不是例如ClassNotLoadedExceptionInterruptedException或在任何时候可能发生的其他数量的异常。您应该在此处抛出自定义异常类,或者至少使用更具体的内容,例如IllegalArgumentException
  3. 如果有多个错误,您的信息将被混淆。与其直接附加到StringBuider上,不如整理一个List<String>错误,然后用例如String.join("; ", errors)生成异常的完整错误消息。
相关问题