Python 异常处理 异常捕获与抛出

传统的一句代码一个if else的方法繁锁,不易理解,不灵活,所以有了“结构化的异常处理SEH”。现代语言都提供SEH支持。

一般的C类语言都是 try catch 方式,比如C#:

try{
    //
}
catch(Exception ex)
{
    //do something
}

如果要捕获多个异常,可以有多个catch。如果多个catch的处理逻辑一样怎么办呢?在以前,的确不方便,但从c#6.0开始支持exception filter后就好多了:

try{
    //
}
catch(MyException ex) when (ex is MySub1Exception || ex is MySub2Exception)
{
    //do something
}

捕获所有异常可以简写成catch{}的方式,这样一来就由于没有接收异常的参数而忽略异常信息了。

抛出异常使用 throw ex; ,但这会影响异常栈。如果想将原异常原样抛出,在catch块中使用 throw ; 即可。

 

python的思想也是类似的,只是“关键字”变了:

try:
    x=1/0
except Exception as ex:
    print(ex)

同样支持多个except。如果多个except类型有相同的逻辑,写法好简洁啊,只需要传递一个异常类型元组:

try:
    1/0
except (MyException1,MyException2) as ex:#python2.x时代写作 except (MyException1,MyException2), ex
    print(ex)

捕获所有异常可以使用 except: print(‘something wrong happened’)。

抛出异常使用 raise关键字,raise后不仅可跟一个异常实例,还可以跟一个异常类让python自动实例化它。类似的,如果想将原异常原样抛出,直接使用不带参数的 raise 即可。

看,语言都是类似的吧?

恩,简洁的语言还是要有所特点的:

try:
    print('I am here')
except:
    print('What?')
else:
    print('No error')

python中许多语句都可以带else,try也不例外。else表示当try中的语句没有发生异常时执行一段逻辑。这在 while True 语句中非常实用。

alwasy do 怎么办? Oh,好吧,还是finally语句!

呵呵,内部的getattr函数也是使用try except的!!

 

实践

在做一件事时去处理可能出现的错误,而不是在开始做事前就进行大量的检查,这个策略可以总结为习语 Leap before You Look。

发表评论

电子邮件地址不会被公开。