Python–12、异常
异常
1、异常本身是类。
2、Python错误回溯:错误的部分会一级一级往上找。
#python 错误回溯
def Base():
print(a)
def b():
Base()
def c():
b()
d = c()
运行结果:
Traceback (most recent call last):
File "/home/pyvip/py61/Python-rts/异常.py", line 16, in <module>
d = c()
File "/home/pyvip/py61/Python-rts/异常.py", line 14, in c
b()
File "/home/pyvip/py61/Python-rts/异常.py", line 11, in b
Base()
File "/home/pyvip/py61/Python-rts/异常.py", line 8, in Base
print(a)
NameError: name 'a' is not defined
3、常见的异常
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bfr1LniB-1580116219705)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200108091717098.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEsNL0PG-1580116219705)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200108091959196.png)]
异常处理
1、异常的捕捉: try …except… 模块
有try 就必须要有expect,其他的else、finally可有也可以不要。
#异常的捕捉
print('------1------')
try: #尝试 程序运行错误 有try 就必须要有expect
#这个部分是可能发生错误的代码
print('a'+1)
# for i in range(4)
except NameError as e: #捕捉指定错误类型,指定之外的错误就不会出现
#对特定类型错误进行的处理
print("命名出错",e)
except (TypeError,ZeroDivisionError) as e1: #可以扩号书写多个
print('类型出错',e1)
raise e1 #主动抛出异常,抛出异常之后finally部分也会执行
except Exception: # 这是范围比较大的错误,一般范围小的放在前面,范围大的放在后面
print('触发Expection')
else: #如果没有错误就会执行else的部分
print('没有错误')
finally: #始终都会执行
print('最终执行')
print('------2------')
2、raise :可以主动抛出异常
格式: raise 异常类型(raise 是主动抛出后面写的异常类型)
例:raise EmptyFileError("%s: is empty" % file) 这里是主动抛出异常,并且可以对内容进行编辑。
3、可以自定义错误
#自定义错误类型
class MyError(Exception): #定义自己的错误类型,继承的Exception
def __init__(self,n):
self.n = n
try:
n = input ('数字:')
if not n.isdigit(): #如果不是数字,就报错a
raise MyError(n)
except MyError as e:
print('自己做的错误,跪着也要收起来:',e.n)
else:
print("我做的很对")
断言
1、assert 1==1
assert 1==2 ‘报错了’
2、语法规则为:
表达式返回True, 不报错
表达式返回False,报AssertionError。
def cat(food):
assert food == '肉'
food = input('猫咪喂食:')
cat(food)
input('输入任意值结束...')
def cat(food):
assert food == '肉'
food = input('猫咪喂食:')
cat(food)
input('输入任意值结束...')