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自己的閉包做用域的問題code
@allCatch def foo(): l = [0, 1, 2] li = l[9] print li def foo2(): foo() def main(): foo2() if __name__ == "__main__": main()
由於咱們的主邏輯是在 foo()函數, 因此比較建議的作法就是把咱們的異常捕捉放在這些咱們須要關注,有可能產生異常的函數主體上,那麼問題又來了,假如我有好幾個這樣的主函數怎麼辦?那就所有加上。。。。:),因此就要封裝好咱們的代碼,不要沒事寫那麼多垃圾代碼纔是王道。作用域