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
里,不再重复抓取。