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