Python编程思想(33):异常类与多异常捕获

李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。

 

《Python编程思想》总目录
《Python编程思想》专栏

1. 异常类

当 Python解释器接收到异常对象时,如何为该异常对象寻找 except块呢?注意到前面的代码中的except块,这个块是专门用于处理该异常类及其子类的异常实例。

当 Python解释器接收到异常对象后,会依次判断该异常对象是否是 except块后的异常类或其子类的实例,如果是, Python解释器将调用该 except块来处理该异常;否则,再次拿该异常对象和下一个 except块里的异常类进行比较。 Python异常捕获的流程如下:

try
    statement1
    statement2  # 抛出异常,产生一个Error对象,需要Exception2进行处理
    ... ...
    # 后面的语句将不再执行      
except Exception1:  # Error会与Exception1比较
    # 处理Exception1
    # 不再执行其他处理异常的块 
    ...
except Exception2:  # Error会与Exception2比较,该块可以处理statement2抛出的Error对象
    # 处理Exception2
    # 不再执行其他处理异常的块 
    ...

从上面的流程可以看出,在try块后可以有多个 except块,这是为了针对不同的异常类提供不同的异常处理方式。当程序发生不同的意外情况时,系统会生成不同的异常对象, Python解释器就会根据该异常对象所属的异常类来决定使用哪个 except块来处理该异常。

通过在try块后提供多个 except块可以无须在异常处理块中使用if判断异常类型,但依然可以针对不同的异常类型提供相应的处理逻辑,从而提供更细致、更有条理的异常处理逻辑。

在通常情况下,如果try块被执行一次,则try块后只有一个 except块会被执行,不可能有多个 except块被执行。除非在循环中使用了 continue开始下一次循环,下次循环又重新运行了try块,这才可能导致多个 except块被执行。

Python的所有异常类都从 BaseException类派生而来,提供了丰富的异常类,这些异常类之间有严格的继承关系,下图显示了 Python的常见异常类之间的继承关系。

从这张图中可以看出, Python的所有异常类的基类是 Base Exception,但如果用户要实现自定义异常,则不应该继承这个基类,而应该从 Exception类继承。

BaseException的主要子类就是 Exception,不管是系统的异常类,还是用户自定义的异常类,都应该从 Exception类派生。下面看一个简单的异常捕获的例子:
示例代码:div_demo. py

import sys
try:
    a = int(sys.argv[1])
    b = int(sys.argv[2])
    c = a / b
    print("您输入的两个数相除的结果是:", c )
except IndexError:
    print("索引错误:运行程序时输入的参数个数不够")
except ValueError:
    print("数值错误:程序只能接收整数参数")
except ArithmeticError:
    print("算术错误")
except Exception:
    print("未知异常")

这段代码导入了sys模块,并通过sys模块的argv列表来获取运行 Python程序时提供的参数(命令行参数)。其中 sys.argv[0]通常代表正在运行的 Python程序名,sys. argv[1]代表运行程序所提供的第1个参数,sys.argv[2]代表运行程序所提供的第2个参数……依此类推。

这段代码针对 IndexError、 ValueError、 ArithmeticError类型的异常,提供了专门的异常处理逻辑。该程序运行时的异常处理逻辑可能有如下几种情形:

  • 如果在运行该程序时输入的参数不够,将会发生索引错误,Python将调用 IndexError对应的 except块处理该异常;
  • 如果在运行该程序时输入的参数不是数字,而是字母,将发生数值错误, Python将调用ValueError对应的 except块处理该异常;
  • 如果在运行该程序时输入的第2个参数是0,将发生除0异常, Python将调用 ArithmeticError对应的 except块处理该异常;
  • 如果在程序运行时出现其他异常,该异常对象总是 Exception类或其子类的实例,Python将调用 Exception对应的 except块处理该异常。

上面程序中的3种异常,都是非常常见的运行时异常,读者应该记住这些异常,并掌握在哪些情况下可能出现这些异常。

2. 多异常捕获

Python的一个 except块可以捕获多种类型的异常。在使用一个 except块捕获多种类型的异常时,只要将多个异常类用圆括号括起来,中间用逗号隔开即可。
下面演示了 Python的多异常捕获:
示例代码:multi_exception_demo.py

import sys
try:
    a = int(sys.argv[1])
    b = int(sys.argv[2])
    c = a / b
    print("您输入的两个数相除的结果是:", c )
except (IndexError, ValueError, ArithmeticError):
    print("程序发生了数组越界、数字格式异常、算术异常之一")
except:
    print("未知异常")

在这段程序中使用了 (IndexError, ValueError, ArithmeticError)来指定所捕获的异常类型,这就表明该 except块可以同时捕获这3种类型的异常。

----------------支持作者请转发本文,也可以加李宁老师微信:unitymarvel,或扫描下面二维码加微信--------


在这里插入图片描述

欢迎关注 极客起源 微信公众号,更多精彩视频和文章等着你哦!
在这里插入图片描述

蒙娜丽宁 CSDN认证博客专家 公众号:极客起源 达芬奇 UM
更多精彩内容请关注微信公众号:「极客起源」,东北大学计算机专业硕士。UnityMarvel创始人,企业内训讲师、IT畅销书作者,CSDN学院讲师,拥有多年软件开发经验和培训经验。主要著作包括《Python从菜鸟到高手》、《Python爬虫技术:深入理解原理、技术与开发》,培训企业学员数千人。制作在线课程数千小时。
©️2020 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值