python什么是闭包的作用域_python的try闭包作用域的问题

0x1:

python的try, except 很给力, 在有一些需要捕捉异常的场景下,能够安装异常的类别来进行特定的操作,假如说现在我们有一个场景是“无论产生什么异常,我们都有一个总的捕捉逻辑,这种情况下,我们就要注意try的闭包作用域问题了

0x2,直接上码:

def allCatch(func):

def wrapper(*args, **kwargs):

try:

ret = func(*args, **kwargs)

return ret

except Exception as e:

print "[allcatch] ------------------- ", e.message

return wrapper

def foo():

l = [0, 1, 2]

li = l[9]

print li

@allCatch

def main():

foo()

if __name__ == "__main__":

main()

上面的这个代码,在main里面执行foo能捕捉到总的异常,但是我们现实中的逻辑可能会是下面这样

def allCatch(func):

def wrapper(*args, **kwargs):

try:

ret = func(*args, **kwargs)

return ret

except Exception as e:

print "[allcatch] ------------------- ", e.message

return wrapper

def foo():

l = [0, 1, 2]

li = l[9]

print li

def foo2():

try:

foo()

except:

print "foo2 except"

@allCatch

def main():

foo2()

if __name__ == "__main__":

main()

上面的代码运行的结果就是

> foo2 except

如我们所见, 如果在main里面有另外的函数也执行了try捕捉异常,那么main本身的try是无效的,也就达不到我们要的目的了。所以我们要注意try本身的闭包作用域的问题

0x3 建议的使用姿势

我们的核心流程函数(也就是我们想捕捉的主要流程所在的函数),我们就在这个函数上进行异常捕捉就行,比如上面的例子,其实我们可以改成

@allCatch

def foo():

l = [0, 1, 2]

li = l[9]

print li

def foo2():

foo()

def main():

foo2()

if __name__ == "__main__":

main()

因为我们的主逻辑是在 foo()函数, 所以比较建议的做法就是把我们的异常捕捉放在这些我们需要关注,有可能产生异常的函数主体上,那么问题又来了,假如我有好几个这样的主函数怎么办?那就全部加上。。。。:),所以就要封装好我们的代码,不要没事写那么多垃圾代码才是王道。

--EOF--

发表于 2019-09-27 09:07:00,并被添加「python」标签。

本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。更多说明 »

提醒:本文最后更新于 446 天前,文中所描述的信息可能已发生改变,请谨慎使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值