专栏首页极客起源Python编程思想(33):异常类与多异常捕获

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

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种类型的异常。

本文分享自微信公众号 - 极客起源(geekculture),作者:geekori

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python编程思想(32):异常处理中的try…except

    现在绝大多数编程语言都支持异常处理,异常处理的通行做法是将正常执行的代码放在特定代码块中,然后再将处理异常的代码放在另一个代码块中,如果正常执行的代码块的某条语...

    蒙娜丽宁
  • Python从菜鸟到高手(1):初识Python

      Python是一种面向对象的解释型计算机程序设计语言,由荷兰人吉多·范罗苏姆(Guido van Rossum)于1989年发明,第一个公开发行版发行于19...

    蒙娜丽宁
  • 好消息,Python编程思想推出了!

    本系列文章深入介绍了Python的各种技术,堪称是目前最全的Python教程。主要目的是让读者可以了解Python的各种核心技术,包括各种Python函数库。本...

    蒙娜丽宁
  • 【Python进阶】Python中的异常处理

    欢迎来到专栏《Python进阶》。在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件、数据的处理,Python各种好用的库如NumPy、...

    用户1508658
  • Python回顾与整理8:错误和异常

            如果想写出用户体验高的代码,那么就需要考虑到在执行自己写的这段代码中在和用户交互的过程中可能会出现的问题,也就是说,需要对可能出现的异常进行处理...

    py3study
  • Python 之异常处理

      在Python中不同的异常可以用不同的类型(Python中统一了类与类型,类型即使类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误。

    py3study
  • 全面理解java异常机制

          在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大牛,你也不可避免出错,所以java为我们提供了异常机制。本文将会从以下几个方面...

    Single
  • 框架设计原则和规范(三)

    此文是《.NET:框架设计原则、规范》的读书笔记,本文内容较多,共分九章,将分4天进行推送,今天推送6-7章。 1. 什么是好的框架 2. 框架设计...

    韩伟
  • Python 异常处理

    Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。

    想偷懒的程序员
  • 自定义异常和带你与太阳肩并肩的神器

    除了系统定义好的异常,在实际工作中,会需要按照业务逻辑定义各种自定义异常,特别是明确的知道某些情况下需要抛出指定异常的时候。因为系统定义的异常有时候不能满足实际...

    用户5745563

扫码关注云+社区

领取腾讯云代金券