изменить поведение Python необработанное исключение для отправки писем - PullRequest
1 голос
/ 03 марта 2012

Я хочу изменить поведение необработанных исключений (все они) в python, чтобы отправлять электронные письма без особого изменения кода или повсеместного использования специальных обработчиков ошибок.

Я надеюсь создать подкласс Exception и затем переопределить его в начале данного модуля.

Итак, подклассы здесь:

class ExceptionMailer(Exception):
    def __init__(self, m):
        self.message = m
        send_email(email_address,self.message)

Тогда в начале модуля я могу сделать это:

Exception = ExceptionMailer

Затем, когда возникает исключение, отправляется электронное письмо с его сообщением. Я заставил это работать строго для Exception, но не для, скажем, ValueError. Я надеялся, что переопределение Exception переопределит все типы ошибок, но я был явно неправ. Возможно ли то, что я пытаюсь сделать?

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Я хочу изменить поведение исключений (все они) ...

Нет, нет. В Python исключения используются для управления потоком. Например, ваш обработчик будет запускаться каждый раз, когда поднимается StopIteration, или происходит сбой функции сравнения, или библиотека использует исключение, чтобы что-то сигнализировать.

Вместо этого просто оберните ваш код в

try:
   # ... large block of code
except BaseException as e:
   send_email(email_address, e.message)
2 голосов
/ 03 марта 2012

В момент, когда вы переопределяете Exception, все его подклассы были созданы, поэтому это не влияет на них:

>>> class A(object):
    def a(self):
        print 'a in A'

>>> class B(A):
    pass

>>> B().a()
a in A
>>> class C(object):
    def a(self):
        print 'a in C'

>>> A = C
>>> B().a()
a in A

Относительно вашей проблемы.Взгляните на sys.excepthook.Это позволяет вам переопределить поведение программы в случае любого необработанного исключения.

...