【学Python自动化】 8. Python 错误和异常学习笔记
一、错误类型
1 语法错误(解析错误)
-
最常见的错误类型
-
解析器会显示出错行和指向错误位置的箭头
-
示例:
while True print('Hello world') # 缺少冒号
2 异常
-
语法正确但执行时触发的错误
-
不同类型异常:
-
ZeroDivisionError: 除零错误
-
NameError: 未定义变量
-
TypeError: 类型错误
-
二、异常处理
1 try-except 语句
while True:try:x = int(input("请输入数字: "))breakexcept ValueError:print("无效数字,请重试")
2 工作原理
-
执行 try 子句
-
无异常则跳过 except
-
有异常则匹配 except 子句
-
异常不匹配则向外层传递
3 多个 except 子句
try:# 代码
except (RuntimeError, TypeError, NameError):# 处理多种异常pass
####4 异常匹配规则
- 类匹配包括其派生类的实例
+except 子句顺序很重要(从具体到一般)
5 获取异常信息
try:raise Exception('spam', 'eggs')
except Exception as inst:print(type(inst)) # 异常类型print(inst.args) # 参数元组print(inst) # __str__ 输出
三、异常层次结构
-
BaseException: 所有异常的基类
-
Exception: 所有非致命异常的基类
-
其他特殊异常:SystemExit, KeyboardInterrupt
四、触发异常
1 raise 语句
raise NameError('HiThere') # 触发异常
raise ValueError # 简写形式
2 重新触发异常
try:raise NameError('HiThere')
except NameError:print('异常发生!')raise # 重新触发
五、异常链
try:open("database.sqlite")
except OSError:raise RuntimeError("无法处理错误") from exc # 异常链
六、用户自定义异常
-
从 Exception 类派生
-
命名以 “Error” 结尾
-
保持简单,主要提供错误信息
七、清理操作
1 finally 子句
try:raise KeyboardInterrupt
finally:print('再见!') # 总会执行
2 finally 特性
-
任何情况下都会执行
-
即使有 return、break、continue
-
返回值以 finally 中的为准
八、预定义清理(with 语句)
with open("myfile.txt") as f:for line in f:print(line, end="")
# 文件会自动关闭
九、处理多个异常
1 ExceptionGroup
excs = [OSError('error 1'), SystemError('error 2')]
raise ExceptionGroup('存在问题', excs)
2 except* 语法
try:f()
except* OSError as e:print("有 OSErrors")
except* SystemError as e:print("有 SystemErrors")
十、异常注释
try:raise TypeError('类型错误')
except Exception as e:e.add_note('添加额外信息')raise
十一、关键点总结
-
区分语法错误和异常
-
try-except 处理预期内的异常
-
finally 确保清理操作执行
-
with 语句自动管理资源
-
自定义异常从 Exception 派生
-
使用异常链和注释提供更多上下文信息
-
ExceptionGroup 处理多个不相关异常
这份笔记涵盖了 Python 错误和异常处理的主要概念和用法,可作为学习和参考的快速指南。