引发电子邮件堆栈跟踪的异常

时间:2016-05-08 17:11:40

标签: python python-2.7 exception

我希望有一个例外,它总是在被引发时发送电子邮件。至于现在,我打算将该代码放入__init()

import sendmail
import configparser


def MailException(BaseException):
    """
    sends mail when initiated
    """
    def __init__(self, message, config=None):
        # Call the base class constructor with the parameters it needs
        BaseException.__init__(message)

        if config is None:
            config = configparser.RawConfigParser()
            config.read('mail.ini')
            config = config['email']

        text = 'exception stack trace + message'

        sendmail.sendMail(text=text, config=config['email'], title='Alert')

我明确地希望在这里发送邮件,而不是在我创建的每个除外块中。因此我想知道如何获得堆栈跟踪,代码必须与Python 2.7兼容。

我唯一能找到的是traceback,但显然只能在except:领域内工作 - 或者有没有办法在Exception类中实现它?还有其他想法吗?

1 个答案:

答案 0 :(得分:2)

首先,请注意(每the docs)您不应该将BaseException作为子类。

其次,不是在异常本身中实现该逻辑,而是可以定义新的sys.excepthook(参见例如Python Global Exception Handling),然后您可以访问完整的追溯:

import sys


class MailException(Exception):
    pass


def mailing_except_hook(exctype, value, traceback):
    if exctype == MailException:
        ...  # do your thing here
    else:
        sys.__excepthook__(exctype, value, traceback)

sys.excepthook = mailing_except_hook