小白在之前文章中有列举过常用异常的情况和产生原因的案例,这篇博文,小白主要总结一下异常处理的方法。
目录
3.当遇到无法预知的异常时,Exception就非常有用,这是所有异常的基类
首先,我们如何发现异常?
我们看下小白的这个案例,traceback:回溯,追溯,其实就是从这个里面定位到你哪一行引发的异常,下面有异常类和具体的错误信息,先告诉我们是哪一类的异常,找到这个后,可以查询小白的之前博文,看下自己的异常属于哪个范围,然后看到具体报错信息,定位错误。当然,这个是对我们异常语句的一个分析过程,下面再具体讲怎样处理和抛出异常。
对于异常的处理,可以分为两类:
一是可以预知的异常,也就是说我们写代码时就知道会引起哪一种异常,比如说一个算术式,我们知道可能产生除数为0的异常,那么我们可以用if-else语句处理这种异常,也可以用try-except捕捉这种特定异常,然后抛出。
二是不可以预知的异常,不可预知的异常,就只能够用try-except语句,而且异常类型也不确定,可能用到异常的基类。
if-else不用多说,下面就主要介绍下try-except的用法,小白也是最近才学习的,有不足之处,欢迎大家提出:
1.简单情况,来看下单分支:
try:
print (1/0)
except ArithmeticError as Error:
print (Error)
看下报错:
division by zero
2.多分支
try:
print (1/0)
except ValueError as Error:
print(Error)
except ZeroDivisionError as Error:
print (Error)
结果:
division by zero
3.当遇到无法预知的异常时,Exception就非常有用,这是所有异常的基类
比如说,我们不知道这个会产生计算的异常,所以没有写出来那些异常的类,那么,当我们写的异常不能抛出问题时,Exception就有了作用,结果和上面一样
try:
print (1/0)
except ValueError as Error:
print(Error)
except Exception as Error:
print(Error)
结果:
division by zero
4.try-finally的用法
try...finally语句无论是否发生异常都将会执行最后的代码。
try:
print (1/1)
except ValueError as Error:
print(Error)
except Exception as Error:
print(Error)
finally:
print('无论是否异常,均执行')
结果:
1.0
无论是否异常,均执行
5.自定义异常
之所以写自定义异常,是因为我们不知道是哪种异常,就可以自定义一个异常来标识,不过这个里面有一些坑,可以看下以下三种情况:
1.无异常发生
这样就显示正确的结果
class MyError(Exception):pass
try:
print(1 / 1)
except:
raise MyError("Something error") from None
2.有异常发生:
先看正确异常抛出自定义异常:
class MyError(Exception):pass
try:
print(1 / 0)
except:
raise MyError("Something error") from None
结果:
---------------------------------------------------------------------------
MyError Traceback (most recent call last)
<ipython-input-26-c4208ad6da52> in <module>
3 print(1 / 0)
4 except:
----> 5 raise MyError("Something error") from None
MyError: Something error
再看一种写法,这种不抛出自定义异常,而按照代码所触发的异常输出:
class MyError(Exception):pass
try:
print(1 / 0)
except MyError as err:
raise MyError("Something error") from err
结果:
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-27-7ae918066202> in <module>
1 class MyError(Exception):pass
2 try:
----> 3 print(1 / 0)
4 except MyError as err:
5 raise MyError("Something error") from err
ZeroDivisionError: division by zero
所以,如果想抛出自定义的异常,用上面一种方法。
对于,异常的抛出,我研究的还不够透彻,如有一些错误之处,欢迎大家指正