Python异常处理结构

526 阅读3分钟

这是我参与更文挑战的第 28 天,活动详情查看: 更文挑战

回顾复习

Python程序运行过程中出现未知情况,导致程序出现错误无法继续执行下去,这个过程称为异常。

当程序出现异常,我们通过捕获异常方式,通过预先设定的逻辑代码让程序继续运行,这个过程称为异常处理。

异常处理是我们面对程序代码可能会出现的错误,进行预先设定相关的代码,从而让程序能够继续执行。

在Python中,要怎么进行异常处理呢?

目前常用的异常处理结构如下:

异常处理结构

1. try..一个except结构

try..except是最常见的异常处理结构。

try:
    被监控的可能引发异常的语句块
except BaseException [as e]:
    异常处理语句块

try块包含着可能引发异常的代码,except块则用来捕捉和处理的异常

执行的时候,如果try块中没有引发异常,则跳过except块继续执行后续代码

执行的时候,如果try中发生了异常,则跳过try块中的后续代码,跳到相应的except块中处理异常

异常处理完后,继续执行后续代码

try..except..

try:
    print("Step1")
    a = 3/0
    print("Step2")
except BaseException as e:
    print("Step3")
    print(e)
print("Step4")

tryexcept运行结果

2. try...多个except结构

一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码。为了避免漏出可能出现的异常,可以在最后增加BaseException.

try:
    被监控的,可能引发异常的语句块
exception Exception1:
    处理Exception1的语句块
exception Exception2:
    处理Exception2的语句块
.....

exception BaseException:
    处理可能遗漏的异常的语句块
    

try..多个except结构

try:
    a = input("please input 被除数:")
    b = input("Please input 除数:")
    c = float(a)/float(b)
    print(c)
except ZeroDivisionError:
    print("异常:除数不能为0")
except TypeError:
     print("异常:不能将字母串转化成数字")
except NameError:
     print("异常:变量不存在")
except BaseException as e:
    print(e)

多个except结构

3. else结构

try...except..else结构增加了else块。

  • 如果try块中没有抛出异常,则执行else块。
  • 如果try块中抛出异常,则执行except块,不执行else块
try:
     a = input("please input 被除数:")
     b = input("Please input 除数:")
     c = float(a)/float(b)

except BaseException as e:
    print(e)

else:
    print("运算结果是:",c)

print("game over")
  • 发送异常的执行情况(执行except块,没有执行else)

else结构运算结果1

  • 没有发送异常执行情况(执行完try块,执行else)

else结构运算结果2

4. finally结构

try...except..finally结构中,finally块无论是否发生异常都会被执行。

通常用来释放try块中申请的资源,比如打开文件之后,关闭文件

finally执行逻辑图如下:

finally结构图

try:
     a = input("please input 被除数:")
     b = input("Please input 除数:")
     c = float(a)/float(b)

except BaseException as e:
    print(e)

else:
    print("运算结果是:",c)

finally:
    print("finally语句块,无论发生异常与否,都执行")

print("game over")

finally运行结果

5. 自定义异常

当我们在实际工作中,有时候也需要自己定义异常类。

  1. 自定义异常类一般都是运行时异常,通常继承Exception或其子类即可。
  2. 命名一般以ErrorException为后缀。
  3. 自定义异常由raise语句主动抛出
class AgeException(Exception):

    def __init__(self,errInfo):

        Exception.__init__(self)
        self.errInfo = errInfo

    def __str__(self):

        return str(self.errInfo)+",年龄不在0~150岁!"

if __name__ == "__main__":

    age = int(input("please input age:"))

    if age < 0 or age > 150:

        raise AgeException(age)
    else:

        print("right age",age)

自定义异常运算结果

总结

本期,我们详细学习了异常处理的5种方法,在工作使用场景上,我们根据自己的需求选择使用。

但是,异常处理本身就是提前警告代码风险情况,我们对于必现的异常进行根除处理,不要留在我们代码中,增加代码的出现问题的风险,提高代码的稳定性。

好啦,以上是本期内容,欢迎大家评论点赞关注,下次见~