文档

Java™ 教程-Java Tutorials 中文版
catch 块
Trail: Essential Classes
Lesson: Exceptions
Section: Catching and Handling Exceptions

catch 块

通过在 try 块之后直接提供一个或多个 catch 块,可以将异常处理程序与 try 块关联。在 try 块的末尾和第一个 catch 块的开头之间不能有代码。

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

每个 catch 块都是一个异常处理程序,它处理由其参数指示的异常类型。参数类型,ExceptionType (异常类型),声明处理程序可以处理的异常类型,并且必须是继承自 Throwable 类的类的名称。处理程序可以使用 name 引用异常。

catch 块包含在调用异常处理程序时执行的代码。当处理程序是调用堆栈中第一个 ExceptionType 与抛出的异常类型匹配时,运行时系统调用异常处理程序。如果抛出的对象可以合法地分配给异常处理程序的参数,则系统认为它是匹配的。

以下是 writeList 方法的两个异常处理程序:

try {

} catch (IndexOutOfBoundsException e) {
    System.err.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

异常处理程序不仅可以打印错误消息或停止程序。它们可以执行错误恢复,提示用户做出决策,或使用链式异常将错误传播到更高级别的处理程序,如 Chained Exceptions 部分所述。

使用一个异常处理程序捕获多种类型的异常

在 Java SE 7 及更高版本中,单个 catch 块可以处理多种类型的异常。此功能可以减少代码重复并减少捕获过于宽泛的异常的诱惑。

catch 子句中,指定块可以处理的异常类型,并使用竖线(|)分隔每个异常类型:

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

注意:如果 catch 块处理多个异常类型,则 catch 参数隐式 final。在此示例中,catch 参数 exfinal,因此你无法在 catch 块中为其指定任何值。


Previous page: The try Block
Next page: The finally Block