第 33 章 异常基础 例外基础知识
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
本书的这一部分涉及异常,,它是可以改变程序控制流的事件。在 Python 中,异常会在出错时自动触发,您的代码也可以触发和拦截异常。它们由我们在这一部分要学习的四条语句来处理,其中第一条语句有两种变化(在此单独列出),最后一条语句在 Python 2.6 和 3.0 之前是可选的扩展:
try/exceptCatch 和可恢复由 Python 或您引发的异常。
try/finally无论是否出现异常,都要执行清理操作。
raise在代码中手动触发异常。
assert有条件地在代码中触发异常。
with/as在 Python 2.6、3.0 及更高版本中实现上下文管理器(在 2.5 中为可选项)。
这个主题被保留到了本书的最后,因为您需要了解类才能编写自己的异常代码。除了少数例外情况(双关语),您会发现异常处理在 Python 中很简单,因为它作为另一种高级工具集成到了语言本身。
为什么要使用异常?
简而言之,异常可以让我们跳出任意大块的程序。请看书中前面讨论的制作披萨的机器人。假设我们认真对待这个想法,并真的制造了这样一台机器。要制作一个披萨,我们的烹饪自动机需要执行一个计划,我们将用 Python 程序实现这个计划:接受订单、准备面团、添加配料、烘烤馅饼,等等。
现在,假设在 "烤馅饼 "的步骤中出了大问题。也许是烤箱坏了,也许是我们的机器人计算错误,导致自燃。显然,我们希望能够快速跳转到能够处理这种状态的代码。既然在这种不寻常的情况下,我们没有希望完成比萨任务,那不如放弃整个计划。
这正是异常让你做到的:你可以一步跳转到异常处理程序,放弃进入异常处理程序后开始的所有函数调用。然后,异常处理程序中的代码可以对引发的异常做出适当的响应(例如,呼叫消防队!)。
将异常视为结构化 "超级 Go "的一种方法。异常处理程序(try 语句)离开一个标记并执行一些代码。在程序的某个更前面的地方,一个异常触发了,它使 Python 跳回那个标记,放弃了在标记离开后调用的任何活动函数。这种协议提供了一种连贯的方式来响应异常事件。此外,由于 Python 会立即跳转到处理程序语句,您的代码会更简单--通常不需要在每次调用可能失败的函数后检查状态代码。
例外角色
在 Python 程序中,异常通常有多种用途。 下面是一些最常见的作用:
- 错误处理
每当 Python 在运行时检测到程序中的错误时,都会引发异常。您可以在代码中捕获并响应错误,或者忽略引发的异常。如果忽略了错误,Python 的默认异常处理行为就会启动:停止程序并打印错误信息。如果您不想要这种默认行为,可以编写一条
try语句来捕获异常并从中恢复--当检测到错误时,Python 将跳转到您的try处理程序,您的程序将在try之后恢复执行。- 活动通知
异常还可以用来提示有效条件,而不必在程序中传递结果标志或明确测试它们。例如,搜索例程可能会在失败时引发异常,而不是返回一个整数结果代码,并希望该代码永远不会是一个有效的结果!
- 特殊情况处理
有时,某种情况可能很少发生,因此很难说有理由让代码在多个地方处理这种情况。在程序的较高层次中,通过异常处理程序来处理异常情况,往往可以消除特殊情况代码。在开发过程中,也可以使用
assert来检查条件是否符合预期。- 终止行动
如您所见,
try/finally语句 允许您保证执行所需的关闭时间操作,而不管程序中是否存在异常。在这方面,较新的with语句为支持该语句的对象提供了另一种选择。 ...
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