# 知识库

# 2.2.4 异常处理

异常处理机制用于捕获错误并做出相应的处理，从而提高程序的稳健性和容错能力，提升用户体验。程序在运行过程中可能遇到除以零、访问已被删除的变量、列表中找不到要删除的元素、用方括号读取字典中不存在的键、打开不存在的文件等情况。若不加处理，解释器会抛出异常并中断程序。Python 提供 try-except 结构来实现异常处理：把可能出错的执行代码放在 try 块中，一旦执行过程中发生异常，程序会跳到对应的 except 异常处理代码块进行处理，从而避免程序直接崩溃，并向用户给出可读的提示。

try-except 的一般形式为：try 后面写执行代码块，except 后面写异常处理代码块；try 与 except 后面的冒号必不可少，其下代码块必须保持同一级缩进。课程示例将 `result = 10 / 0` 放在 try 中，except 中执行 `print("除零错误")`：

```python
try:
    result = 10 / 0
except:
    print("除零错误")
```

执行时 10 除以 0 会引发异常，程序不会在 try 内继续，而是转入 except，输出“除零错误”，之后还可以继续运行 try-except 之后的语句。如果 try 中没有发生异常，则跳过 except，按正常流程执行。

本章前面已经出现过若干常见运行时异常，都可以用同一套结构捕获：用 `del` 删除变量后再访问会引发 NameError；把内置函数 `list` 覆盖为变量后再调用 `list('abc')` 会引发 TypeError；列表的 `remove()`、`index()` 找不到指定元素会引发 ValueError；`pop()` 在列表为空或索引超出范围时会引发 IndexError；用方括号访问字典中不存在的键会引发 KeyError，可用 `get()` 避免。教案还要求编写程序尝试打开一个不存在的文件并捕获异常，这与后续 `open()` 文件操作衔接，同样是把打开文件的语句放入 try、在 except 中给出提示。

使用时要注意几个常见坑。第一，try 块应只包裹真正可能出错的语句，不要把无关代码一并塞进去，否则一旦异常发生，try 中尚未执行的语句会被跳过，排查更困难。第二，课程示例使用不指定类型的 except，能捕获各类异常，便于入门；但若静默忽略或提示过于笼统，可能掩盖真正的错误原因，实际编程应给出明确提示。第三，异常处理不能代替事先检查：能用条件判断预防的（例如除数是否为 0、键是否在字典中），应优先判断；对难以事先完全预判的运行时错误，再用 try-except 兜底。二者配合，才能写出更稳健的程序。

## 关键要点
- 异常处理用于捕获错误并做出相应处理，提高程序的稳健性、容错能力，提升用户体验。
- Python 用 try-except 结构实现异常处理：可能出错的代码放在 try 中，发生异常则跳到 except。
- try、except 后面必须有冒号，其下代码块缩进必须一致。
- 课程示例：`10 / 0` 被 except 捕获后输出“除零错误”。
- 常见运行时异常：NameError、TypeError、ValueError、IndexError、KeyError；打开不存在的文件也可捕获。
- 常见坑：try 范围过大；except 后静默忽略；用异常处理代替本可用 if 完成的事先检查。
