# try-except-finally 结构

URL: https://caijiao.org/python/ch09/try
Source: docs/python/ch09/try.md
Description: 本章介绍 Python 中的 'try-except-finally' 结构，讲解如何捕获异常并确保无论如何都能执行清理操作。

在 [Python](/python/) 中，`try-except-finally` 结构是一种用于异常处理的机制。通过这种结构，我们可以捕获和处理程序运行中可能出现的错误，同时确保在程序结束时执行必要的清理操作。

## `try-except` 语句

`try-except` 语句用于捕获并处理异常。`try` 块中包含可能引发异常的代码，`except` 块用于捕获并处理特定的异常类型。

```python
try:
    x = 1 / 0  # 引发除零错误
except ZeroDivisionError as e:
    print("错误发生:", e)  # 输出：错误发生: division by zero
```

### 捕获多种异常

可以在同一个 `try` 语句中捕获多种不同类型的异常，每个异常类型可以有独立的处理方式。

```python
try:
    x = int("abc")  # 引发 ValueError
except ZeroDivisionError as e:
    print("除零错误:", e)
except ValueError as e:
    print("值错误:", e)  # 输出：值错误: invalid literal for int() with base 10: 'abc'
```

### 捕获所有异常

使用 `except` 块不指定异常类型时，表示捕获所有类型的异常。建议仅在确实需要的情况下使用这种方式，因为它会捕获所有异常类型，可能隐藏程序中的错误。

```python
try:
    x = 1 / 0
except Exception as e:
    print("捕获到异常:", e)  # 输出：捕获到异常: division by zero
```

## `else` 语句

`else` 块用于在没有异常发生时执行的代码。如果 `try` 块没有引发异常，`else` 块中的代码将会执行。

```python
try:
    result = 10 / 2
except ZeroDivisionError as e:
    print("发生错误:", e)
else:
    print(f"运算结果: {result}")  # 输出：运算结果: 5.0
```

## `finally` 语句

`finally` 块中的代码无论是否发生异常都会被执行。常用于执行清理操作，如关闭文件、释放资源等。

```python
try:
    f = open("file.txt", "r")
    content = f.read()
except FileNotFoundError as e:
    print("文件未找到:", e)
finally:
    print("文件处理完毕")  # 输出：文件处理完毕
    f.close()  # 无论是否发生异常，都会关闭文件
```

### `finally` 用法示例

```python
try:
    x = 1 / 0  # 引发除零错误
except ZeroDivisionError:
    print("除以零错误")
finally:
    print("清理工作完成")  # 输出：清理工作完成
```

## 总结

- `try-except` 结构用于捕获并处理异常；
- `else` 语句块在没有异常发生时执行；
- `finally` 语句块保证无论是否有异常都会执行，常用于清理工作。
