美文网首页Python基础
Python:浅谈 finally

Python:浅谈 finally

作者: 子休_ | 来源:发表于2020-03-27 16:28 被阅读0次

代码抛出异常导致程序崩溃,是每个人都经历的痛苦,特别在网络编程里,由于网络的不确定性,我们不得不在大量去捕捉这些异常。
然而现有的 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 里,不再重复抓取。

相关文章

网友评论

    本文标题:Python:浅谈 finally

    本文链接:https://www.haomeiwen.com/subject/emzluhtx.html