第46集:异常类型与捕获

学习目标

  • 掌握常见的Python异常类型
  • 学会精确捕获特定异常
  • 理解异常的继承关系
  • 掌握多个except的用法
  • 学会处理复杂异常情况

一、常见异常类型

算术异常

# ZeroDivisionError: 除零错误
try:
    result = 10 / 0
except ZeroDivisionError:
    print("除数不能为零")

类型异常

# TypeError: 类型错误
try:
    result = "10" + 20
except TypeError:
    print("类型不匹配")

值异常

# ValueError: 值错误
try:
    num = int("abc")
except ValueError:
    print("无法转换为整数")

索引异常

# IndexError: 索引越界
try:
    lst = [1, 2, 3]
    print(lst[10])
except IndexError:
    print("索引超出范围")

键异常

# KeyError: 键不存在
try:
    d = {"a": 1, "b": 2}
    print(d["c"])
except KeyError:
    print("键不存在")

文件异常

# FileNotFoundError: 文件不存在
try:
    with open("nonexistent.txt", "r") as f:
        content = f.read()
except FileNotFoundError:
    print("文件不存在")

二、异常继承层次

BaseException
├── SystemExit
├── KeyboardInterrupt
├── GeneratorExit
├── Exception
    ├── StopIteration
    ├── ArithmeticError
    │   ├── ZeroDivisionError
    │   └── FloatingPointError
    ├── LookupError
    │   ├── IndexError
    │   └── KeyError
    ├── TypeError
    ├── ValueError
    └── OSError
        ├── FileNotFoundError
        └── PermissionError

示例1:捕获异常基类

try:
    lst = [1, 2, 3]
    print(lst[10])
except LookupError as e:
    # LookupError是IndexError和KeyError的基类
    print(f"查找错误:{e}")

三、多个except

示例2:处理多种异常

def safe_operation(value):
    """安全操作"""
    try:
        result = int(value)
        return 100 / result
    except ValueError:
        return "无法转换为整数"
    except ZeroDivisionError:
        return "除数不能为零"
    except Exception as e:
        return f"其他错误:{e}"

print(safe_operation("10"))    # 输出:10.0
print(safe_operation("abc"))    # 输出:无法转换为整数
print(safe_operation("0"))     # 输出:除数不能为零

示例3:异常顺序很重要

# ❌ 错误:Exception会捕获所有异常
try:
    result = 10 / 0
except Exception:
    print("通用异常")
except ZeroDivisionError:
    print("除数错误")  # 永远不会执行

# ✅ 正确:先捕获具体异常
try:
    result = 10 / 0
except ZeroDivisionError:
    print("除数错误")
except Exception:
    print("通用异常")

四、实际应用

案例:列表操作安全函数

def safe_get(lst, index, default=None):
    """安全获取列表元素"""
    try:
        return lst[index]
    except IndexError:
        return default
    except TypeError:
        return default

print(safe_get([1, 2, 3], 1))      # 输出:2
print(safe_get([1, 2, 3], 10))     # 输出:None
print(safe_get(None, 0, "错误"))     # 输出:错误

五、课后练习

练习1

编写一个函数,处理多种可能的异常。

练习2

实现一个安全的字典访问函数。

练习3

编写一个文件操作函数,处理文件相关的所有异常。

练习4

使用异常继承关系优化异常处理。

练习5

实现一个综合的异常处理示例。

« 上一篇 异常处理基础-try-except 下一篇 » finally语句