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
任何人都可以列出如果遇到这种情况会很糟糕的例外情况吗?
Throwable
而不是 Exception,因为它也会捕获
Error
。