python-异常
除零异常 ZeroDivisionError
名称异常 NameError
类型异常 TypeError
索引异常 IndexError
键异常 KeyError
值异常 ValueError
属性异常 AttributeError
迭代器异常 StopIteration
错误信息的获取:
错误信息中最后一行的第一个单词
异常处理方案一
捕获所有错误:
try:
num=int(input('请输入整数:')) #容易出错的代码
except:
print('你输入错误') #出错后,进行处理的代码
根据错误类型进行捕获:
try:
num=int(input('请输入整数:')) #容易出错的代码
num = 8/num
except ValueError :
print('请输入正确的整数') #出错后,进行处理的代码
except ZeroDivisionError :
print('除0错误')
说明:except后面是错误信息,可以有多个
多种异常一起处理:
try: #s=1/0 print(name) except (ZeroDivisionError,NameError): #同时捕获不同异常 print('除0异常或名称异常')
捕获未知错误:
try:
num=int(input('请输入整数:')) #容易出错的代码
num = 8/num
except ValueError :
print('请输入正确的整数') #出错后,进行处理的代码
except Exception as cuowuxinxi:
print('错误信息:%s'%cuowuxinxi)
说明:cuowuxinxi保存返回的错误信息,这个错误信息和错误类型不一样
这个应该在所有预测到的错误类型之后
异常捕获的完整语法:
finally与return相遇时,先执行finally再return
异常处理方案二
with open('1.png','r') as f:#会自动执行__enter__方法,把返回的文件对象赋值给f #不管下面的代码是否出现异常,都会执行__exit__即自动退出文件 f.readline()
自定义上下文管理器:
class Test:
def __enter__(self):
print('enter')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit:')
print(self, exc_type, exc_val, exc_tb)
with Test() as x:
print('body',x)
执行以上代码时的结果是:
enter --->先执行预处理函数__enter__
body <__main__.Test object at 0x0000009D1DDAD518> --->执行代码,x是__enter__函数的返回值
exit: --->最后执行退出函数
<__main__.Test object at 0x000000DE4971D518> None None None
class Test:
def __enter__(self):
print('enter')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit:')
print(exc_type, ',',exc_val,',', exc_tb)
return True #返回True不会再抛出异常信息
with Test() as x:
print('body')
1/0 #产生异常,把异常信息传给__exit__函数
显示结果:
exc_type--->异常类型
exc_val--->异常值
exc_tb--->追踪信息
class Test: def __enter__(self): print('enter') return self def __exit__(self, exc_type, exc_val, exc_tb): print('exit:') print(exc_type, ',',exc_val,',', exc_tb) import traceback print(traceback.extract_tb(exc_tb)) #打印追踪信息 #[<FrameSummary file D:/ss/ssss/test1.py, line 15 in <module>>] return True with Test() as x: print('body') 1/0
人为抛出异常raise:
def a(age): if age<0 or age>120: #print('年龄值错误') raise ValueError('年龄值错误') #ValueError 是异常类型 #参数 提示信息。except ValueError as x,这个参数会赋值给x else: print('张三的年龄是',age) a(-18)
自定义异常类型:
class lesszero(Exception):#自定义异常类,继承与Exception def __init__(self,msg): self.msg=msg def __str__(self): return self.msg def a(age): if age<0 or age>120: raise lesszero('年龄值错误') #抛出自定义异常类-执行异常类 #参数传给msg else: print('张三的年龄是',age) try: a(-18) except lesszero as x: #x就是__str__返回的值 print('异常被处理',x) #异常被处理 年龄值错误
天子骄龙