前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python编程思想(33):异常类与多异常捕获

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

作者头像
蒙娜丽宁
发布2020-07-08 14:03:35
7160
发布2020-07-08 14:03:35
举报
文章被收录于专栏:极客起源极客起源

1. 异常类

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

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

代码语言:javascript
复制

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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种类型的异常。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客起源 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档