2014-10-07 101 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