> **GESP等级：四级 | 考级考点：GESP Python 四级**

# 第07节：try-except 捕获异常

## 课程导学（00:00-10:00）

### 错误类型三分类——程序出错的三种情况

**⭐ 图片知识点补充：语法错误 vs 运行时错误 vs 逻辑错误**

在学 try-except 之前，我们先了解程序出错有**三种类型**：

| 类型 | 英文名 | 什么意思 | 生活类比 | 身体锚点 |
|:----:|:------:|---------|:--------:|:--------:|
| ① 语法错误 | SyntaxError | 代码没按Python语法写，像说错话 | 说"我吃饭了没"→语法不通 | 🤭 捂住嘴 |
| ② 运行时错误 | RuntimeError（异常） | 语法对，但运行时出了问题 | 走路好好的突然绊一跤 | 🤕 假装摔倒 |
| ③ 逻辑错误 | Logic Error | 代码能跑，但结果不对 | 1+1算成了3 | 🤔 挠头 |

```python
# === ① 语法错误：Python看不懂！===
# print("hello"   ← 少了右括号，Python直接报错
# → SyntaxError: '(' was never closed

# === ② 运行时错误：执行时出问题 ===
# 语法完全正确，但运行时报错
print(int("abc"))   # → ValueError: invalid literal
print(10 / 0)       # → ZeroDivisionError: division by zero

# === ③ 逻辑错误：结果不对！===
# 代码能跑完，但算错了
radius = 5
area = 3.14 * radius * 2      # ❌ 周长！应该是 radius * radius
print(f"圆的面积是{area}")    # 输出了，但结果是错的！
```

**记忆口诀**：
> **"语法错误不会跑，运行时错误半路倒，逻辑错误跑完结果孬"**

**教学要点**：
- 语法错误 → 最难找，IDE红线帮忙（还没运行就知道错了）
- 运行时错误 → try-except 可以捕获！（本节课重点）
- 逻辑错误 → 只能靠仔细检查代码逻辑

### 问题导入
```python
int("abc")  # 这行代码会怎样？
```
运行结果：`ValueError: invalid literal for int() with base 10: 'abc'`

**程序崩溃了！** 用户输入"abc"时，整个程序直接报错退出。这在真实的软件中是不可接受的——不能让用户的一次小错误导致整个应用崩溃。

**解决方案**：`try-except` 结构可以让程序在遇到错误时优雅处理，继续运行。

### 记忆钩子
> **try = 试一下** —— 尝试执行可能出错的代码
> **except = 出错了怎么办** —— 出错时执行的兜底代码

## 知识点讲解（10:00-30:00）

### ① try-except 基本语法

```python
try:
    # 可能出错的代码
    risky_code()
except:
    # 出错时执行的代码
    handle_error()
```

**执行流程**：
- 先执行 `try` 块中的代码
- 如果没有异常，跳过 `except` 块
- 如果有异常，立即跳转到 `except` 块执行

### ② 常见异常类型

| 异常类型 | 产生原因 | 示例 |
|----------|----------|------|
| `ValueError` | 值错误，函数接收了类型正确但值不合适的参数 | `int("abc")` |
| `TypeError` | 类型错误，操作或函数应用于不适当类型的对象 | `"1" + 2` |
| `NameError` | 名称错误，使用了未定义的变量 | `print(x)`（x未定义） |
| `ZeroDivisionError` | 除零错误 | `10 / 0` |

> **最佳实践**：应当捕获具体的异常类型，而不是使用裸 `except:`，这样可以避免掩盖意料之外的错误。

### ③ 捕获指定异常的语法

```python
try:
    n = int(input("请输入数字: "))
except ValueError:
    print("输入的不是有效数字！")
```

### ④ 捕获多个异常

```python
try:
    n = int(input("请输入数字: "))
    result = 10 / n
except ValueError:
    print("请输入有效的数字！")
except ZeroDivisionError:
    print("除数不能为零！")
```

## 演示代码（30:00-40:00）

参见同目录下的 `demo_*.py` 文件。

## 实操练习（40:00-55:00）

参见同目录下的 `practice_exercises.py` 文件。

## 小测（55:00-60:00）

参见同目录下的 `quiz.py` 文件。

---

### 参考答案

**问：try 里面出错会怎样？**
答：当 try 块中的代码抛出异常时，程序立即停止执行 try 块中剩余的代码，跳转到对应的 except 块执行。如果 except 块处理成功，程序继续运行后续代码，不会崩溃。
