python 异常处理

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的错误的

大概就是这样了,如果有纰缪,还望海涵以及不客气地指正~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值