python 的try & except是难舍难分的:
python的try和except语句主要遵循以下四种规则:
1st:执行try和except之间的语句,没有错误就将try语块执行完就ok
2nd: 如果发生异常,从发生异常的那行跳到except语句,执行except语句的内容
3rd:执行except语句时
首先检查except (ValueError ...)的括号里有没有相应的错误,
如果没有,则会抛出异常
如果有,则执行完except语块后接着从整个try块后开始执行
下面是一个例子:
# -*- coding: gbk -*-
while True:
try:
x = int(input("please enter a number:"))
print("no error ,so this clause is excuted")
break
except (RuntimeError, TypeError, NameError,ValueError):
print("oops u've done it unsuccessfully, try again...%c"%('\n'))
print("从try 后执行")
下面是执行结果:
please enter a number:ww
oops u've done it unsuccessfully, try again...
从try 后执行
please enter a number:12
no error ,so this clause is excuted
当然,上面是最简单的异常处理,还有其他的一些稍微复杂的情况:(这里的raise就是用户故意让某些个错误出现的一种方式;)
try有多个except的情况:
class B(Exception):
pass
class C(B): #可以视作我们自己写的exception,他的名字在下面被视为B错误
pass
class D(C):
pass
for cls in [B, C, D]:
try:
raise cls()
except D:
print("D")
except C:
print("C")
except B:
print("B")
结果为
B
C
D
这很好,我们换一下except的顺序:
class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except B:
print("B") except C: print("C") except D: print("D")
结果变为了:
B
B
B
这是因为C,D均为B的子类,在检查B的时候,会将其自身以及其所有的子类都match一遍,所以结果就是bbb了,于是当有多个except时,务必将except按照从"最具体(小)的"到“最不具体(大)的”来排列,以避免产生以上的结果;
当然,还有一个finally没有提及到,就像他的名字,最终。。。。,就是无论怎么样,finally块都会执行,他总是在当try执行完了去执行的,看例子:
try:
raise KeyboardInterrupt
finally:
print('Goodbye, world!')
结果是:
Goodbye, world!Traceback (most recent call last):
Python Shell, prompt 166, line 2
builtins.KeyboardInterrupt:
可见,当finally执行完了还是会re-raise该raise的错误的
大概就是这样了,如果有纰缪,还望海涵以及不客气地指正~