# 异常类型与处理机制

URL: https://caijiao.org/python/ch09/exceptions
Source: docs/python/ch09/exceptions.md
Description: 本章介绍 Python 中的异常类型与处理机制，讲解如何通过异常处理机制捕获并应对程序运行中的错误。

异常处理是程序中处理错误和异常情况的关键技术。通过异常处理，我们可以避免程序因为错误而中断，并且可以根据不同的异常类型执行不同的处理逻辑。

## 异常类型

[Python](/python/) 中有多种内建的异常类型，每种类型表示不同的错误情况。常见的异常类型包括：

- `ZeroDivisionError`：除以零时抛出的异常
- `ValueError`：传入函数的值类型不符合要求时抛出的异常
- `IndexError`：索引超出序列范围时抛出的异常
- `FileNotFoundError`：文件未找到时抛出的异常
- `TypeError`：传入错误类型的参数时抛出的异常
- `KeyError`：访问不存在的字典键时抛出的异常

例如：

```python
try:
    x = 1 / 0
except ZeroDivisionError as e:
    print("除以零错误:", e)  # 输出：除以零错误: division by zero
```

## 异常处理机制

Python 提供了 `try`、`except`、`else` 和 `finally` 语句来处理异常。其基本结构如下：

```python
try:
    # 可能引发异常的代码
    pass
except <异常类型> as e:
    # 异常处理代码
    pass
else:
    # 如果没有异常，执行的代码
    pass
finally:
    # 无论是否有异常，都执行的代码
    pass
```

### `try` 和 `except`

`try` 块中放置可能引发异常的代码，`except` 块捕获并处理异常。

```python
try:
    result = 10 / 0
except ZeroDivisionError as e:
    print("错误:", e)  # 输出：错误: division by zero
```

### `else` 和 `finally`

`else` 块在 `try` 块没有引发异常时执行，`finally` 块无论是否有异常都会执行。

```python
try:
    number = int(input("请输入一个整数: "))
except ValueError as e:
    print("无效的输入")
else:
    print(f"你输入的数字是: {number}")
finally:
    print("程序执行完毕")
```

## 自定义异常

除了使用内建异常类型外，我们还可以通过继承 `Exception` 类来创建自定义的异常类型。

```python
class CustomError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)

try:
    raise CustomError("自定义错误发生")
except CustomError as e:
    print(f"捕获到自定义异常: {e}")  # 输出：捕获到自定义异常: 自定义错误发生
```

## 异常链

在处理异常时，有时需要在一个异常的处理过程中抛出另一个异常。Python 支持异常链，它允许我们保留原始异常信息。

```python
try:
    raise ValueError("初始错误")
except ValueError as e:
    raise RuntimeError("处理过程中发生错误") from e
```

## 总结

- Python 提供了丰富的异常类型，用于表示不同的错误情况；
- 通过 `try`、`except`、`else` 和 `finally` 可以灵活地处理异常；
- 我们可以通过自定义异常类型和异常链来增强异常处理的灵活性。
