# `catch`块

> 原文： [https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html](https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html)

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

```
try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

```

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

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

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

```
try {

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

```

异常处理程序不仅可以打印错误消息或停止程序。他们可以进行错误恢复，提示用户做出决定，或者使用链式异常将错误传播到更高级别的处理程序，如[链式异常](chained.html)部分所述。

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

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

在`catch`子句中，指定块可以处理的异常类型，并使用垂直条（`|`）分隔每个异常类型：

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

```

**注**：如果`catch`块处理多个异常类型，则`catch`参数隐含`final`。在此示例中，`catch`参数`ex`为`final`，因此您无法在`catch`块中为其分配任何值。