gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:18:55 25 4
gpt4 key购买 nike

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;
}

上面的代码来 self 正在开发的一个项目。我正在解析多个项目,如果它们不包含正确的信息,我想抛出异常并停止一起解析该项目。通过抛出 throw new Exception(errors.toString()); 我认为这会终止整个过程。目前情况并非如此。我对此的单元测试正在通过,但我在其他地方发现了一个错误,这表明异常并没有完全停止解析。这里处理异常处理的最佳方法是什么?如果出现错误,我不会进行任何解析。

最佳答案

By throwing throw new Exception(errors.toString()); I would think that terminates the entire process.

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

异常的目的是传达操作可能失败的信息,从而为调用代码提供一种通知此情况的方法以及一种处理此情况的方法(例如重试、回退、采用 B 计划、询问用户更多信息)输入等...)。

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

杀死整个进程绝对不是你应该为响应无效的Item而做的事情。 。 尤其不在这个级别。即使您出于某种原因确实需要终止该进程,也应该在顶层(在您的 main() 中)完成此操作。方法(或类似的容器顶级生命周期方法)。

因此,要回答您明确的问题“如何完全停止执行”:此方法的调用者本身应该抛出异常,以表明它无法成功执行任务(由于到无效的 Item )。并且它的调用者应该抛出一个异常来指示更广泛的操作失败等,一直到堆栈的顶部。这些可以通过捕获和包装您的初始异常来显式抛出,或者它们可以简单地不捕获您的异常并让它冒泡。

其他问题

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

关于java - 如何使用异常处理来完全停止执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62323557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com