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--

專題「編程語言」的其它文章 ?

Comments

toto足球指数