Python:浅谈 finally

代码抛出异常导致程序崩溃,是每个人都经历的痛苦,特别在网络编程里,由于网络的不确定性,我们不得不在大量去捕捉这些异常。
然而现有的 TCP/IP 网络体系最有意思的就是哪怕你是一个在这个领域深耕多年的大神,你写出来的代码依旧会在你想不到的地方抛出异常。而一旦没有妥善回收socket资源,就会发生资源泄露。
于是为了妥善处理一些无论是否发生了异常都需要处理的事,有了finally
finally中的代码,无论在try: ... except: ...中是否成功捕捉到了异常,都会最终执行。

但看下面这个例子:

def test_finally():
    try:
        assert False
    except AssertionError:
        print("except")
        return
    finally:
        print("finally")

except 成功捕捉了 AssertionError 异常,并且通过 return 语句终止了函数的执行。那么 finally 里的语句呢?是否会执行?
答案是:会。哪怕在函数在 finally 之前已经 return 了,其中的语句依旧会执行。


这一特性给一些特殊情况下的代码编写带来了一些便利:

async def crawl_page(self, url: str) -> None:
    try:
        text = await self.fetch(url)
    except UnicodeDecodeError:
        return
    finally:
        self.histories.add(url)
    ... # 一些解析页面的代码

稍微解释一下这几行代码,当我们调用 crawl_page 函数去抓取页面回来解析时,如果无法成功解码页面则直接终止函数的执行,且无论是否解码成功,只要抓取过的函数就会被加进 self.histories 里,不再重复抓取。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试pyth...
    _宁采臣阅读 4,638评论 0 10
  • 什么是异常 本节开始介绍之前,先看看如下程序: 是不是很熟悉,这是我们前面经常看到的程序运行出现的错误。作为Pyt...
    泷汰泱阅读 3,308评论 0 0
  • 一、概要 ​ 一个程序即使没有任何语法错误,即使解题的逻辑也正确,在执行的时候仍然可能出现 各种“运行时错误”,导...
    唯老阅读 3,229评论 0 1
  • 一、简介 Python最强大的结构之一就是它的异常处理能力,所有的标准异常都使用类来实现,都是基类Exceptio...
    随风化作雨阅读 8,201评论 0 1
  • 书接上回,祁德隆抬手推开了虚掩着的殿堂大门。眼前的景象令人目瞪口呆。 这是一个会让人立刻想起"乌烟瘴气"这个词语的...
    天下学问夜航船阅读 3,421评论 0 4

友情链接更多精彩内容