2016-05-08 2 views
2

Ich möchte eine Ausnahme haben, die immer eine E-Mail sendet, wenn sie ausgelöst wird. Was nun, plante ich diesen Code in __init() zu setzen:Ausnahme, dass E-Mails bei der Erstellung des Stacks eine Ablaufverfolgung auslösen

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') 

ich ausdrücklich die E-Mail-Senden hier haben möchte, statt in jedem außer-Block I erstellen. Daher frage ich mich, wie man den Stack-Trace bekommt, der Code muss mit Python 2.7 kompatibel sein.

Das einzige, was ich finden konnte, war traceback, aber das funktioniert anscheinend nur innerhalb der except: Realm - oder gibt es eine Möglichkeit, es innerhalb der Exception-Klasse zu implementieren? Irgendwelche anderen Ideen?

Antwort

2

Erstens, beachten Sie, dass (the docs) sollten Sie keine Unterklasse BaseException.

Zweitens, anstatt diese Logik in der selbst Ausnahme implementieren könnten Sie ein neue sys.excepthook (siehe zum Beispiel Python Global Exception Handling) definieren Sie dann Zugriff auf das vollständige Zurückverfolgungs erhalten:

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 
Verwandte Themen