【Python】异常处理方法(try-except)

    小白在之前文章中有列举过常用异常的情况和产生原因的案例,这篇博文,小白主要总结一下异常处理的方法。

首先,我们如何发现异常?

我们看下小白的这个案例,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

所以,如果想抛出自定义的异常,用上面一种方法。

      对于,异常的抛出,我研究的还不够透彻,如有一些错误之处,欢迎大家指正

发布了91 篇原创文章 · 获赞 125 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Jarry_cm/article/details/103264293