python的try, except 很给力, 在有一些须要捕捉异常的场景下,可以安装异常的类别来进行特定的操做,假如说如今咱们有一个场景是“不管产生什么异常,咱们都有一个总的捕捉逻辑,这种状况下,咱们就要注意try的闭包做用域问题了python
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()
复制代码
上面的代码运行的结果就是app
foo2 except函数
如咱们所见, 若是在main里面有另外的函数也执行了try捕捉异常,那么main自己的try是无效的,也就达不到咱们要的目的了。因此咱们要注意try自己的闭包做用域的问题spa
@allCatch
def foo():
l = [0, 1, 2]
li = l[9]
print li
def foo2():
foo()
def main():
foo2()
if __name__ == "__main__":
main()
复制代码
由于咱们的主逻辑是在 foo()函数, 因此比较建议的作法就是把咱们的异常捕捉放在这些咱们须要关注,有可能产生异常的函数主体上,那么问题又来了,假如我有好几个这样的主函数怎么办?那就所有加上。。。。:),因此就要封装好咱们的代码,不要没事写那么多垃圾代码才是王道。code