《数据结构与算法:Python语言描述》一2.4Python异常

简介:

本节书摘来自华章出版社《数据结构与算法:Python语言描述》一书中的第2章,第2.4节,作者 裘宗燕,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.4Python异常

现在简单介绍Python异常与类的关系,语言内建的异常类层次结构,以及Python语言如何利用面向对象的观点组织异常处理过程。编程中有时需要自己定义异常(类型),如果需要这样做,就应该选一个系统异常类,从它派生。

2.4.1异常类和自定义异常

异常是Python语言中的一套特殊的控制机制,主要用于支持错误的检查和处理,也可以用于实现特殊的控制转移。如果程序执行中发生异常,无论是解释器发现的异常情况(例如除零或类型错误等),还是通过raise语句引发的异常,正常执行控制流立刻终止,解释器转入异常处理模式,查找能处理所发生异常的处理器。如果找不到相应的异常处理器,在交互解释环境下,系统将在环境中输出错误信息,结束当前执行并回到系统的交互状态,等待下一输入。在直接执行方式下,当前程序直接终止。
程序运行中发生的每个异常都有特定的名字,如ValueError、TypeError、ZeroDivision-Error等,解释器根据发生的异常去查找处理器。Python里处理异常的结构是try语句。每个try语句可以带有任意多个except子句,这种子句就是异常处理器,子句头部用一个表达式描述它捕捉和处理的异常。
实际上,Python的异常都是类(class),运行中产生异常就是生成相应类的实例对象,异常处理机制完全基于面向对象的概念和性质。全体内部异常类构成了一个树形结构,所有异常类的基类是BaseException,其最主要的子类是Exception,内置异常类都是这个类的直接或间接派生类。如果用户需要定义异常,就应该从系统异常类中选择一个合适的异常,从它派生出自己的异常类。例如:

class RationalError(ValueError):
    pass

最简单的情况(很常见)只是希望定义一种特殊异常,并不需要这种异常有什么特殊功能(如上即是)。在这种情况下,选一个系统异常类派生自己的异常类,类体不需要定义任何属性。但为了语法完整,可以在这里写一个pass语句。
如果运行中发生异常,查找相应处理器的工作由解释器完成,这里的工作方式也基于对象和类的关系。在一个except子句头部可以列出一个或多个异常名(一般说,是表示异常类的表达式),列出多个异常名时需要采用括号括起的元组形式。列在except子句头部的异常名表示本异常处理器准备捕捉和处理的异常。
运行中发生的异常与处理器的匹配按面向对象的方式处理。假设运行中发生的异常是e,如果一个异常处理器头部列有异常名E,且isinstance(e,E)为真,那么这个处理器就能捕捉并处理异常e。举例说,如果运行中引发了一个RationalError异常,某个处理器头部列出了RationalError,或者ValueError,或者Exception,该处理器都能捕捉这个异常。当然,匹配ValueError的处理器还能捕捉和处理其他异常,匹配Exception的处理器能捕捉和处理各种主要异常。

2.4.2异常的传播和捕捉

运行中的异常可能发生在模块层面的语句的执行中,更多情况是发生在某个函数的执行中。假设在函数f的执行中发生异常e,当前执行立即中断,解释器转入异常处理模式,设法找到处理e的处理器。有关查找过程如下:
首先在发生异常的函数体里查找处理器:
如果发生异常的语句位于一个try语句体里,首先顺序检查这个try语句后部的各except子句,检查是否存在能处理e的处理器。
如果发生异常的try语句的所有异常处理器都不能处理e,解释器转去查看包围着该try语句的外围try语句(如果存在),检查是否存在能与e匹配的异常处理器。这个查找过程将在e发生的函数f里逐层进行。
如果e不能在函数f里处理,f的执行异常终止,e在函数f这次执行的调用点重新引发,导致又一轮处理器查找工作。查找规则与上面一样。
如果上面查找过程在某一步找到了与e匹配的处理器,解释器就转去执行该except子句的体(异常处理器代码)。执行完这段代码后,解释器回到正常执行模式,从该异常处理器所在的try语句之后继续执行。
上述查找过程可能导致函数一层层以异常方式退出,有可能一直退到当前模块的最上层也没有找到与之匹配的处理器:
如果程序是在解释器的交互方式下执行,Python解释器终止该模块执行并回到交互状态,输出错误信息后等待用户的下一个命令。
如果程序是自主执行(或称按批处理方式执行),该程序立即终止。
如果异常发生在主模块的表层(不在任何函数里),处理过程同样如上所述。
在异常处理过程中还可能出现一些情况。例如,正在执行处理器代码时又发生了新异常;或者处理中遇到某些特殊情况,需要引发新的异常。Python语言里还有关于这些情况的细节规定,这里就不继续讨论了。

2.4.3内置的标准异常类

Python语言定义了一套标准异常类,它们都是BaseException的派生类,其最重要子类是Exception,标准异常类都是Exception的直接或间接派生类。
下面是一些常见异常,后面有些例子从其中一些异常派生自己的异常类:

BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
     +-- ArithmeticError
     |    +-- FloatingPointError
     |    +-- OverflowError
     |    +-- ZeroDivisionError
     +-- AssertionError
     +-- AttributeError
     +-- EOFError
     +-- ImportError
     +-- LookupError
     |    +-- IndexError
     |    +-- KeyError
     +-- NameError
     |    +-- UnboundLocalError
     +-- OSError
     |    +-- BlockingIOError
     |    +-- ChildProcessError
     |    +-- ConnectionError
     |    |    +-- BrokenPipeError
     |    |    +-- ConnectionAbortedError
     |    |    +-- ConnectionRefusedError
     |    |    +-- ConnectionResetError
     |    +-- FileExistsError
     |    +-- FileNotFoundError
     |    +-- InterruptedError
     |    +-- IsADirectoryError
     |    +-- NotADirectoryError
     |    +-- PermissionError
     |    +-- ProcessLookupError
     |    +-- TimeoutError
     +-- ReferenceError
     +-- RuntimeError
     |    +-- NotImplementedError
     +-- SyntaxError
     |    +-- IndentationError
     |         +-- TabError
     +-- SystemError
     +-- TypeError
     +-- ValueError
     |    +-- UnicodeError
     |         +-- UnicodeDecodeError
     |         +-- UnicodeEncodeError
     |         +-- UnicodeTranslateError

这个图并不完全,还有一些被分类为“警告”(Warning)的异常等。

相关文章
|
1月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
169 1
|
1月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
257 2
|
1月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
144 4
|
1月前
|
存储 监控 算法
基于 PHP 布隆过滤器的局域网监控管理工具异常行为检测算法研究
布隆过滤器以其高效的空间利用率和毫秒级查询性能,为局域网监控管理工具提供轻量化异常设备检测方案。相比传统数据库,显著降低延迟与资源消耗,适配边缘设备部署需求,提升网络安全实时防护能力。(238字)
145 0
|
2月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
185 26
|
2月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
182 0
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
282 102
|
2月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
254 103

热门文章

最新文章

推荐镜像

更多