Python基础

Python:浅谈 finally

2020-03-27  本文已影响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 里,不再重复抓取。

上一篇下一篇

猜你喜欢

热点阅读