捕获 Exception 基类有什么问题?

问题描述 投票:0回答:1

Google 声称人们不应该永远抓住基类

Exception
。相反,您应该确定将在 try 块内引发的所有非基异常类,并创建一个列出所有特定子类型的 catch 语句。我不明白为什么这是个好主意。

考虑下面编写 Web 服务处理程序的情况。 try 块包含所有正常处理,最后返回 200 响应代码以及计算结果。有一个 catch 块,它创建 400 错误响应,并将异常编码在返回消息中。像这样的东西:

handleWebRequest( request,  response ) {
    try {
        method1();
        method2();
        method3();
        response.writeResponse(200, responseObject);
    }
    catch (Exception e) {
        response.writeResponse(400, formErrorObject(e));
        logError(e);
    }
}

指南说不要直接捕获

Exception
类,而是捕获可能来自方法 1、2 和 3 的所有特定类型。例如,如果 method1 抛出 Exception1 等,您可能会得到如下所示的结果:(需要包含
RuntimeException
,因为这些不会出现在签名中。)

handleWebRequest( request,  response ) {
    try {
        method1();
        method2();
        method3();
        response.writeResponse(200, responseObject);
    }
    catch (Exception1|Exception2|Exception3|RuntimeException e) {
        response.writeResponse(400, formErrorObject(e));
        logError(e);
    }
}

一个人可以做到这一点,但是如果稍后 method2 更改为抛出

Exception2
Exception2a
呢?编码标准规定,每次使用 method2 时,您都应该返回并修改 catch 块。

如果忘记修改这个catch条件怎么办?然后就会出现未捕获的异常,并且您将不会从服务器返回任何错误响应。编译器不会警告您忘记包含异常类型 - 事实上您不会希望这样,因为让异常飞到下一个级别是很常见的。

但在这种情况下,捕获所有异常是绝对重要的。最聪明的方法是捕获基类Exception

。它将“自动”包含 method2 可能获得的任何新异常类型。我们确信我们希望从服务发回错误响应
无论抛出什么异常。

谁能告诉我在这种情况下捕获基础
    Exception
  • 类会造成什么危害?

    任何人都可以列出如果遇到这种情况会很糟糕的例外情况吗?
您永远不应该捕获
java exception try-catch
1个回答
0
投票
,因为这也会捕获 RuntimeException。您可能想要捕获 RuntimeExceptions 的一次是使用 ThreadPool 并希望无论如何都保持线程处于活动状态。但在这种情况下,您应该捕获

Throwable

 而不是 Exception,因为它也会捕获 
Error

© www.soinside.com 2019 - 2024. All rights reserved.