2016-05-08 14 views
2

例外が発生した場合は、常にメールを送信したいと考えています。今のように、私は__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クラス内で実装する方法がありますか?他のアイデア?

答えて

2

まず、BaseExceptionをサブクラス化しないでください(the docs)。

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 

第二に、例外自体にそのロジックを実装するのではなく、あなたは、あなたが完全なトレースバックへのアクセスを取得し、sys.excepthook新しい(例えばPython Global Exception Handlingを参照)を定義することができ

関連する問題