第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
实现一个综合的异常处理示例。