第 6 章 例外情况 例外情况
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
Python 使用 异常来指示错误和异常。当 Python 检测到一个错误时,它会引发一个异常--也就是说,Python 通过向异常传播机制传递一个异常对象来提示异常情况的发生。您的代码可以通过执行raise语句显式地引发异常。
处理异常意味着从传播机制中捕获异常对象,并采取必要的措施处理异常情况。如果程序不处理异常,程序就会带着错误信息和回溯信息终止。不过,通过使用带有except子句的try语句,程序可以处理异常,并在出现错误或其他异常情况时继续运行。
Python 还使用异常来表示一些不是错误,甚至不是异常的情况。例如,正如"迭代器 "中所介绍的,在迭代器中调用下一个内置函数时,如果迭代器没有更多的项,就会引发StopIteration。这不是错误,甚至也不是异常,因为大多数迭代器最终都会用完项目。因此,Python 中检查和处理错误及其它特殊情况的最佳策略与其它语言不同;我们将在"错误检查策略 "中介绍它们。
本章介绍如何使用异常处理错误和特殊情况。本章还将介绍标准库的日志模块(参见"记录错误")和断言语句(参见"断言语句")。
尝试声明
try语句是 Python 的核心异常处理机制。它是一个复合语句,包含三种可选子句:
-
它可能有零个或多个except子句,定义如何处理特定类别的异常。
-
如果它有except子句,那么紧接着还可能有一个else子句,只有在try套件没有引发异常时才会执行。
-
无论是否有except子句,它都可能只有一个finally子句,而且是无条件执行的,其行为包含在"try/except/finally "中。
Python 的语法要求至少有一个except子句或finally子句,这两个子句也可能出现在同一条语句中;else只有在一个或多个except之后才有效。
try/except
下面是try语句的try/except形式的语法:
try:statement(s)except[expression[astarget]]:statement(s)[else:statement(s)][finally:statement(s)]
这种形式的try语句有一个或多个 except子句,以及一个可选的else子句(还有一个可选的finally子句,其含义与是否存在except和else 子句无关:我们将在下一节介绍)。
每个except子句的主体称为 异常处理程序。当except子句中的表达式与try子句中传播的异常对象相匹配时,代码就会执行。expression是一个类或一串类,放在括号中,并与这些类或其子类的任何实例相匹配。可选的target是一个标识符,它命名了一个变量,Python 会在异常处理程序执行前将该变量与异常对象绑定。处理程序也可以通过调用sys模块的exc_info函数(3.11+或exception函数) (见表 9-3)来获取当前的异常对象。
下面是try语句的try/except形式的示例:
try:1/0('not executed')exceptZeroDivisionError:('caught divide-by-0 attempt')
当出现异常时,try套件会立即停止执行。如果try语句中包含多个异常子句,异常传播机制会按顺序检查异常子句;表达式与异常对象匹配的第一个 ...
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