2014-10-07 3 views
2

Я определил собственное исключение, которое мне нужно отслеживать и запускать процесс всякий раз, когда он вызывается. В настоящее время я прилагаю каждую строчку, которая подвержена этой ошибке в случае пары try - except, но по мере роста кода это начинает выглядеть все более уродливым и громоздким.Перехватить конкретное исключение в модуле в Python

Есть способ сделать это с помощью модуля-модуля try - except заявление?

Т.Л., д-р

В настоящее время я делаю это:

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

+0

Вы можете использовать инфраструктуру python [introspection] (https://docs.python.org/2/library/inspect.html) для повторения классов и функций в модуле. Замена каждой функции завернутой версией может оказаться сложной, хотя ... – campkeith

Смежные вопросы