Yunyuzuiluo

Python百战 进阶 1 异常机制

异常机制本质:

当程序出现异常,程序安全的退出、处理完后继续执行的机制

异常类:

python中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。下面较为完整的展示了python中内建异常类的继承层次:

python中一切都是对象,异常也采用对象的方式来处理。处理过程:
1.抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常一个对象,停止当前执行路径,并把异常对象提交给解释器。
2.捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常

定位异常:

当发生异常时,解释器会报相关的错误信息,并会在控制台打印出相关错误信息。我们只需按照从上到下的顺序即可追溯(Trackback)错误发生的过程,最终定位引起错误的那一行代码。

try和except结构

try:
被监控的可能引发异常的语句块
except BaseException [as e]:
异常处理语句块

示例与输出:

try:
print("step1")
a=3/0
print("step2")#终止了,不输出这个
except BaseException as e:
print("step3")
print(e)
print("step4")

step1
step3
division by zero
step4

try...多个except结构

示例:

try:
a = input("请输入被除数:")
b = input("请输入除数:")
c = float(a)/float(b)
print(c)
except ZeroDivisionError:#专门捕获除数为零的情况
print("异常:除数不能为0")
except TypeError:#捕获类型不匹配的错误
print("异常:除数和被除数都应该为数值类型")
except BaseException as e:#作为兜底处理所有其他异常
print(e)# 把错误赋值给e
print(type(e))

try...except...else结构

如果 try 块中没有抛出异常,则执行else 块。如果 try 块中抛出异常,则执行 except 块,不执行 else 块。

try...except...finally结构

inally 块无论是否发生异常都会被执行;通常用来释放 try 块中申请的资源。

【示例】读取文件, finally 中保证关闭文件资源

try:
with open("d:/a.txt", 'r') as f: # 使用with语句自动管理资源
content = f.readline()
print(content)
except FileNotFoundError:
print("错误:文件不存在")
except PermissionError:
print("错误:没有文件访问权限")
except Exception as e: # 其他异常
print(f"读取文件时出错: {e}")
finally:
print("step4") # 此处可以放无论成功失败都要执行的代码

Python常见异常类型速查表

基础异常
Exception - 所有内置异常的基类
BaseException - 所有异常的终极基类(含系统退出等)
值异常
ValueError - 值无效(如int('a'))
TypeError - 类型错误(如1 + 'a')
IndexError - 索引越界(如list[10])
KeyError - 字典键不存在(如dict['x'])
AttributeError - 属性不存在(如obj.x)
计算异常
ZeroDivisionError - 除零错误(如1/0)
OverflowError - 数值溢出(罕见)
IO异常
FileNotFoundError - 文件不存在
PermissionError - 权限不足
IOError - 输入输出错误(Python3合并到OSError)
系统异常
ImportError - 导入模块失败
ModuleNotFoundError - 模块不存在
NameError - 变量未定义
UnboundLocalError - 局部变量未初始化
其他高频异常
StopIteration - 迭代器结束
AssertionError - assert失败
KeyboardInterrupt - Ctrl+C中断
MemoryError - 内存耗尽

with上下文管理

with 上下文管理可以自动管理资源,在 with 代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出 with块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用。

with context_expr [ as var]:
语句块

traceback模块和生成异常日志

import traceback
try:
print("step1")
num = 1/0
except:
traceback.print_exc()

自定义异常类

程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以Error 、 Exception 为后缀。
自定义异常由 raise 语句主动抛出。

class ValidationError(Exception):
"""当输入数据验证失败时抛出"""
pass

def validate_age(age):
if age < 0:
raise ValidationError("年龄不能为负数")
if age > 120:
raise ValidationError("年龄不能超过120岁")

try:
validate_age(-5)
except ValidationError as e:
print(f"验证错误: {e}")

posted on 2025-05-12 15:50  刘晋宇  阅读(18)  评论(0)    收藏  举报

导航