gpt4 book ai didi

Java - 如何正确处理 try catch block

转载 作者:行者123 更新时间:2023-11-29 08:43:35 24 4
gpt4 key购买 nike

我想知道处理 try/catch block 的正确约定是什么。很明显 try block 中应该包含什么,但是 catch block 呢?

我可以像下面这样给用户写一条消息吗:

       do {
try {
System.out.println("Pi to the number of decimal places:");
Scanner in = new Scanner(System.in);
userNth = in.nextInt();
} catch (Exception e) {
System.out.println("Error: Enter a number between 1 and 100");
}
} while(userNth < 1 || userNth > piDecimals);

或者这是不好的做法?

最佳答案

异常处理不是做出轻率假设的地方;通常在执行这部分代码时,这是因为发生了意想不到的事情,此时您需要最小心地准确检测和记录发生的事情,以便您可以判断需要修复的地方。

Exception 作为捕获的异常类型的选择范围太广。您调用的方法出于截然不同的原因抛出 3 个不同的异常;其中只有一个是应该在这里捕获的。像 NullPointerException 这样未经检查的异常也会被它捕获。如果您要向此 catch block 添加一些代码而无意中引入了 NPE,则很难找出问题出在哪里。过于宽泛的捕获可能会导致无法发现错误或无法正确处理错误。

(顺便说一句,Makoto 提出了一个很好的观点,即 nextInt 无论如何都不应该在这里调用。)

在您确定异常的含义的少数情况下(例如,如果您在 Makoto 的示例代码中捕获了 InputMismatchException 或 NumberFormatException),不记录异常是可以接受的。但与捕获异常相结合,它有能力隐藏错误并引起困惑。

您可能选择捕获 Exception,因为处理一堆不同的已检查异常(其中大多数似乎无论如何都不太可能发生)似乎是一件无法忍受的麻烦事。通过为您不知道如何处理的异常提供合理的默认情况,提供一致的处理和记录异常的方式将有所帮助。这样,如果您看到无法处理的异常,您始终可以选择让它被抛出(可能捕获它并将其包装在未经检查的异常中),知道如果抛出它将被记录并结束您的程序。

对于一个非常小的命令行程序,有时让您无法处理的异常从 main 中抛出是完全可以的(通过向 main 方法添加 throws Exception)。这适用于玩具示例、小型学校项目等;如果有计划记录输出(比如将 stderr 重定向到文件的批处理文件),我只会在生产代码中使用它:

public static void main(String... args) throws Exception {
... application code
}

在大多数情况下,所有主要方法代码都应放在 try block 中,在该 block 中捕获并记录任何 Throwable:

public static void main(String... args) {
try {
... application code here
}
catch (Throwable t) {
logger.log(t);
}
}

这两种选择都会降低您不恰本地吞下不方便的已检查异常的诱惑。

关于Java - 如何正确处理 try catch block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38165851/

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