返回介绍

终止行为

发布于 2024-01-29 22:24:15 字数 2117 浏览 0 评论 0 收藏 0

最后,try语句可以说"finally",也就是说,它可以包含finally代码块。这看上去就像是异常的except处理器,但是try/finally的组合,可以定义一定会在最后执行时的收尾行为,无论try代码块中是否发生了异常。

在这里,如果try代码块完成后没有异常,finally代码块就会执行,而程序会在整个try后继续下去。在这个例子中,这条语句似乎有点笨:我们似乎也可以直接在函数调用后输入print,从而完全跳过try:

不过,这样编写会存在一个问题:如果函数调用引发了异常,就永远到不了print。try/finally组合可避免这种缺点:一旦异常确实在try代码块中发生时,当程序被层层剥开,将会执行finally代码块。

在这里,我们没有看到"after try?"消息,因为当异常发生时,控制权在try/finally代码块后中断了。与其相对比的是,Python跳回去执行finally的行为,然后把异常向上传播到前一个处理器(在这个例子中,就是顶层的默认处理器)。如果我们修改这个函数中的调用,使其不触发异常,则finally程序代码依然会执行,但程序就会在try后继续运行。

在实际应用中,try/except的组合可用于捕捉异常并从中恢复,而try/finally的组合则很方便,可以确保无论try代码块内的代码是否发生了任何异常,终止行为一定会运行。例如,可能使用try/except来捕捉从第三方库导入的代码所引发的错误,然后以try/finally来确保关闭文件,或者终止服务器连接的调用等行为一定会执行。这一部分稍后会看到实际应用的例子。

虽然从概念上讲是用于不同的用途,但是,在Python 2.5中,我们可以在同一个try语句内混合except和finally子句:finally一定会执行,无论是否有异常引发,而且也不管异常是否被except子句捕捉到。

我们将在下一章中看到,在使用某些类型的对象的时候,Python 2.6和Python 3.0提供了try/finally的一种替代。with/as运行一个对象的环境管理逻辑,来确保终止行为的发生:

尽管这个选项需要寥寥数行代码,它只是在处理某些对象类型的时候才适用,因此,try/finally是一种更加通用的终止结构。另一方面,with/as还运行启动操作并且支持用户定义的环境管理代码。

为什么要在意:错误检查

了解异常是多么有用的方法之一就是,比较Python以及没有异常的语言的代码风格。例如,如果想以C语言编写稳健的程序,一般得在每个可能出错的运算之后测试返回值或状态码,然后在程序执行时传递测试结果。

实际上,现实的C程序中,通常用于处理错误检测和用于实际工作的代码数量相当。但是,在Python中,你就不用那么谨小慎微和神经质。你可以把程序的任意片段包装在异常处理器内,然后编写从事实际工作的部分,假设一切都工作正常。

因为控制权在异常发生时就会立刻跳到处理器,没必要让所有代码都去预防错误的发生。再者,因为Python会自动检测错误,所以程序代码通常不需要事先检查错误。重点在于,异常让你大致上可以忽略罕见情况,并避免编写检查错误程序代码。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文