2014-10-07 66 views
2

我定義了一個自定義異常,我需要跟蹤並隨時觸發一個進程。目前,我附上易於在對中引發錯誤的每一行,但隨着代碼的增長,這開始變得越來越醜陋和麻煩。在Python中截取模塊範圍內的特定異常

是否有辦法使模塊範圍的try-except聲明?

TL;博士

我目前這樣做:

class MyError(exception): 
    pass 

try: 
    #error-prone code 
except MyError: 
    context_aware_function() 

而且我在尋找這樣的:

class MyError(exception): 
    pass 

errorManager.redirect(from=MyError,to=context_aware_operation) 
#error-prone code 

回答

2

你可以在每個函數的攔截異常通過註釋decorators。裝飾器被實現爲一個函數,它將一個函數作爲輸入並返回該函數的修改版本。在這種情況下,我們使用try/except塊封裝輸入函數:

def catch_error(function): 
    def wrapper(*args, **kws): 
     try: 
      return function(*args, **kws) 
     except MyError: 
      #handle error 
    return wrapper 

@catch_error 
def foo(): 
    #error-prone code 
+0

好策略。結合所有函數的自動裝飾,這可能是一個很好的解決方案,但不幸的是我的函數隱藏在對象內部,所以我真的需要一個模塊範圍的重定向。 – chiffa 2014-10-07 05:00:07

+0

您可以使用python [introspection](https://docs.python.org/2/library/inspect.html)框架遍歷模塊中的類和函數。用包裝版本替換每個函數可能會很棘手,但... – campkeith 2014-10-08 04:40:36