第 34 章 异常编码细节 异常编码细节
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在上一章中,我们对与异常相关的语句进行了快速浏览。在这里,我们将进行更深入的挖掘--本章将更正式地介绍 Python 中的异常处理语法。具体来说,我们将探索try,raise,assert 和with 语句背后的细节。我们将看到,尽管这些语句大多简单明了,但它们为处理 Python 代码中的异常情况提供了强大的工具。
备注
先说一个程序问题:近年来,异常故事发生了重大变化。从 Python 2.5 开始,finally 子句可以与except 和else 子句出现在同一个try 语句中(以前,它们不能组合在一起)。另外,从 Python 3.0 和 2.6 开始,新的with 上下文管理器语句已成为正式语句,用户定义的异常现在必须被编码为类实例,它们应该继承于内置异常超类。此外,3.X 运动对raise 语句和except 子句的语法稍作修改,其中一些语法在 2.6 和 2.7 中可用。
在本版中,我将重点介绍最近发布的 Python 2.X 和 3.X 中异常的状况,但由于在未来一段时间内,您仍很有可能在代码中看到原始技术,因此我会顺便指出这一领域的发展情况。
try/except/else 语句
现在,我们已经看到了的基础知识,现在是讨论细节的时候了。在下面的讨论中,我将首先把try/except/else和try/finally 作为单独的语句来介绍,因为在 Python 2.5 之前的版本中,它们的作用是不同的,不能合并在一起,而且至少在逻辑上现在仍然是不同的。根据前面的说明,在 Python 2.5 及以后的版本中,except 和finally 可以混合在一个try 语句中;我们将在单独探讨这两种原始形式之后,再看看这种合并的影响。
从语法上讲,try 是一个多部分的复合语句,。它以try 标题行开头,然后是一个缩进语句块(通常);接着是一个或多个except 子句,用于确定要捕获的异常和处理异常的块;最后是一个可选的else 子句和块。通过将try 、except 和else 缩进到同一级别(即垂直排列),可以将它们关联起来。以下是 Python 3.X 中最完整的一般格式,以供参考:
try:
statements # Run this main action first
except name1:
statements # Run if name1 is raised during try block
except (name2, name3):
statements # Run if any of these exceptions occur
except name4 as var:
statements # Run if name4 is raised, assign instance raised to var
except:
statements # Run for all other exceptions raised
else:
statements # Run if no exception was raised during try block从语义上讲,该语句中try 标题下的块代表语句的主要操作--您要运行并包入错误处理逻辑的代码。except 子句为try 块中出现的异常定义了处理程序,而else 子句(如果已编码)则提供了一个在没有出现异常时运行的处理程序。这里的
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access