更改python未处理异常的行为以发送电子邮件

时间:2012-03-03 10:37:16

标签: python email exception subclass

我想在python中更改未处理的Exceptions(所有这些)的行为,以便在不更改代码的情况下发送电子邮件或在任何地方使用特殊的错误处理程序。

我希望将Exception子类化,然后在给定模块的开头重新定义它。

所以子类化就在这里:

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

然后在模块开始时我可以这样做:

Exception = ExceptionMailer

然后,当引发异常时,会发送包含该消息的电子邮件。我已经将此工作严格用于Exception但不是ValueError。我希望重新定义Exception会重新定义所有错误类型,但我显然是错的。我正在尝试做什么?

2 个答案:

答案 0 :(得分:2)

在您重新定义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。它允许您在任何未捕获的异常情况下重新定义程序行为。

答案 1 :(得分:2)

  

我想改变异常(所有这些)的行为......

不,你没有。在Python中,异常用于流控制。例如,每次引发StopIteration或比较函数失败时,您的处理程序都会触发,或者库使用异常来发出信号。

相反,只需将代码包装在

try:
   # ... large block of code
except BaseException as e:
   send_email(email_address, e.message)