python的try閉包做用域的問題

0x1:

python的try, except 很給力, 在有一些須要捕捉異常的場景下,可以安裝異常的類別來進行特定的操做,假如說如今咱們有一個場景是「不管產生什麼異常,咱們都有一個總的捕捉邏輯,這種狀況下,咱們就要注意try的閉包做用域問題了python

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

上面的代碼運行的結果就是app

foo2 except函數

如咱們所見, 若是在main裏面有另外的函數也執行了try捕捉異常,那麼main自己的try是無效的,也就達不到咱們要的目的了。因此咱們要注意try自己的閉包做用域的問題code

0x3 建議的使用姿式

  • 咱們的核心流程函數(也就是咱們想捕捉的主要流程所在的函數),咱們就在這個函數上進行異常捕捉就行,好比上面的例子,其實咱們能夠改爲
@allCatch
def foo():
  l = [0, 1, 2]
  li = l[9]
  print li


def foo2():
  foo()

def main():
  foo2()


if __name__ == "__main__":
  main()

由於咱們的主邏輯是在 foo()函數, 因此比較建議的作法就是把咱們的異常捕捉放在這些咱們須要關注,有可能產生異常的函數主體上,那麼問題又來了,假如我有好幾個這樣的主函數怎麼辦?那就所有加上。。。。:),因此就要封裝好咱們的代碼,不要沒事寫那麼多垃圾代碼纔是王道。作用域

相關文章
相關標籤/搜索