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());
,我认为这将终止整个过程。这不是目前正在发生的事情。我的单元测试已经通过,但是我在其他地方发现了一个错误,这清楚表明异常并未完全停止解析。在这里处理异常处理的最佳方法是什么?如果有错误,我不会进行任何解析。
答案 0 :(得分:0)
通过抛出抛出新的Exception(errors.toString());我认为这将终止整个过程。
您为什么这么认为?抛出异常只会通过“返回”该异常而导致当前的方法退出。
异常的目的是传达操作可能失败的信息,从而使调用代码既可以了解此情况,又可以解决此问题(例如,重试,后备,采用计划B,要求用户提供更多信息)输入等)。
实际上,根据您示例中的名称,这正是应该正在发生的情况。一些代码希望确保item
有效,因此它调用您的validateItem()
方法进行检查。在正常情况下,一切都很好,但在例外情况下,则存在问题-因此,调用代码可以处理该问题(例如,通过将400个响应代码返回给HTTP客户端;通过显示一个向用户说明错误并询问错误的对话框)他们可以更正;通过决定不继续进行缓存更新并保留先前的Item
;或其他基于其所做的相关操作。
为了响应无效的Item
,绝对不应该执行整个过程。 尤其是不在此级别。即使您确实出于某种原因需要终止该进程,也应该在您的main()
方法(或类似的容器的顶层生命周期方法)的顶层执行此操作。
所以要回答您明确的问题“我如何完全停止执行”:该方法的调用者本身应引发异常,以指示它无法成功执行 任务(由于到无效的Item
)。并且 its 调用者应该抛出一个异常,以指示更广泛的操作失败,等等,一直到栈顶。这些可以通过捕获并包装您的初始异常而被明确抛出,也可以根本无法捕获您的异常并使之冒泡。
其他问题
validateInfo()
方法返回boolean
。因此,我认为从其签名中假设,如果true
有效,则该方法将返回Info
,否则将返回false
。抛出异常反而违反了最小惊讶原则。如果在这种情况下真的需要抛出异常,请让方法返回void
-缺少异常将表示有效输入。java.lang.Exception
对象。由于Exception
位于非常大的类层次结构的顶部,因此它也包括所有其他形式的异常,这意味着调用者无法确定该异常是由于无效项引起的,而不是例如ClassNotLoadedException
,InterruptedException
或在任何时候可能发生的其他数量的异常。您应该在此处抛出自定义异常类,或者至少使用更具体的内容,例如IllegalArgumentException
。StringBuider
上,不如整理一个List<String>
错误,然后用例如String.join("; ", errors)
生成异常的完整错误消息。