目录
Exception—异常机制
Python异常处理机制简单说明
try...except...包含的多种结构
try...一个except...结构
try...多个except结构
try...except...else结构
try...except...finally结构
return语句和异常处理问题
常见异常的汇总
with上下文管理
traceback模块
自定义异常类
Exception—异常机制
python中,引进了很多用来描述和处理异常的类
Python异常处理机制简单说明
Python中一切皆对象,异常也采用对象的方式来处理。处理过程:
1.抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器
2.捕获异常:解释器得到该异常后,寻找相关代码处理该异常
解释器解决的关键:定位
当发生异常时,解释器会报相关的错误信息,并在控制台打印相关错误信息,只需按照从上至下的顺序,即可追溯错误发生的过程
try...except...包含的多种结构 try...一个except...结构
try...except是常见的异常处理结构。结构如下:
try:
被监控的可能引发异常的语句块
except baseException [as e]:
异常处理语句块
# 测试try……except……结构# 循环输入数字,若不是数字则抛出异常,输入21结束循环while True: try: a = int(input("请输入一个数字:")) print(a) if a == 21: break except baseException as e: print(e) print("输入异常!!!")print("循环结束!!!")'''请输入一个数字:23输出:23请输入一个数字:g输出:invalid literal for int() with base 10: 'g'输出:输入异常!!!请输入一个数字:21输出:21输出:循环结束!!!'''
执行时,若try块中未引发异常,则跳过except语句块继续执行后续代码;若执行时在try中发现了异常,则跳过try语句中的后续代码,跳到相应的except块中处理异常,异常处理完毕后继续处理except之后的别的代码
try...多个except结构
上面的baseException可以捕获所有的异常,但从经典理论考虑,一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序)并且针对性的写出异常处理代码,为了避免遗漏可能出现的情况,可在最后添加baseException。结构如下:
try:
被监控的可能引发异常的语句块
except Exception1 :
处理Exception1的语句块
except Exception2 :
处理Exception2的语句块
……
except baseException :
处理可能遗漏的异常的语句块
# 测试try……多个except的基本用法try: a = int(input("请输入一个除数:")) b = int(input("请输入一个被除数:")) c = float(a)/float(b) print(c)except ZeroDivisionError : print("异常,0不可做为被除数")except ValueError : print("异常,输入的值不是数字,不能进行除法操作")except NameError : print("自变量不存在")except baseException as e: print(e)print("输出结束!!!")'''请输入一个除数:5请输入一个被除数:0输出:异常,0不可做为被除数输出:输出结束!!!请输入一个除数:g输出:异常,输入的值不是数字,不能进行除法操作输出:输出结束!!!'''
try...except...else结构
try...except...else结构中增加了“else块”,如果try中没有抛出异常,则执行else语句块,如果try中抛出异常,则执行except语句块,不执行else语句块,其二者是并列且竞争关系。结构如下:
try:
被监控的可能引发异常的语句块
except Exception1 :
处理Exception1的语句块
except Exception2 :
处理Exception2的语句块
……
except baseException :
处理可能遗漏的异常的语句块
else:
try正常执行后执行的语句块
# 测试try……except……else结构try: f = open("d:\a.txt","r") content = f.readline() print(content)except baseException as e: print(e)else: print("成功找到{0}文件".format(f))f.close()'''输出:1234566成功找到<_io.TextIOWrapper name='d:\a.txt' mode='r' encoding='cp936'>文件'''
try...except...finally结构
try...except...finally结构中,finally块无论是否发生异常都会被执行,通常用来释放try中申请的资源,结构如下:
try:
被监控的可能引发异常的语句块
except baseException [as e]:
异常处理语句块
finally:
语句块
# 测试try……except……finally语句import ostry: f = open("e:\a.txt", "r") content = f.readline() print(content)except baseException as e: print(e)finally: if os.path.exists("e:\a.txt"): f.close() print("程序执行结束!!!")'''输出:[Errno 2] No such file or directory: 'e:\a.txt'程序执行结束!!!'''
return语句和异常处理问题
由于return有两种作用:结束方法的运行和返回值。
一般不把return放到异常处理结构中,而是放到方法最后
常见异常的汇总
Python中的异常都派生自baseException类,异常汇总:
with上下文管理
try...一系列结构中,finally块由于是否发生异常都会执行,通常用来释放资源
结构:
with context_expr [as var]:
语句块
with上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入该代码之前的现场或上下文,不论何种原因跳出with块,不论是否存在异常,总能保证资源正常释放。在文件操作、网络通信相关的场合非常常用
# 测试with语句(不是取代try……except……finally,而是为了在文件操作管理和网络通信方面使用)with open("E:\codeblock..cc\1.cpp\a.txt", "r") as f: content = f.readline() print(content)'''输出:姓名=小王,年龄=20,性别=男'''
traceback模块
使用traceback模块打印异常信息
import traceback
try:
print("xxxxxx")
num = 1/0
except:
traceback.print_exc()
# 测试traceback模块用法import tracebacktry: print("x"*10) a = 1/0except baseException: with open("E:\codeblock..cc\1.cpp\a.txt","a") as f: traceback.print_exc(file=f)'''输出:XXXXXXXXXX'''
自定义异常类
程序开发中,有时也需要自己定义异常类,其一般情况是运行时异常通常继承Exception或其子类即可,命名一般以Error、Exception为后缀
自定义异常有raise语句主动抛出
# 测试自定义异常类class AgeError(Exception): def __init__(self, errorinfo): Exception.__init__(self) self.errorinfo = errorinfo def __str__(self): return str(self.errorinfo)+",年龄错误,年龄应在1-150之间"##########测试代码#############if __name__ =="__main__": # 如果为TRUE,则文件是作为独立模块运行,可以执行测试代码 age = int(input("请输入一个年龄:")) if age < 0 or age > 150: raise AgeError(age) else: print(age)'''请输入一个年龄:200输出:Traceback (most recent call last): File "E:python projectpy project 01mypy20.py", line 15, in