2017-04-03 84 views
0

基本上我希望在线程内发生未处理的异常时使用Django mail_admins收到一封电子邮件。目前,我有一个处理POST请求的视图,它看起来像:如何捕获python线程中发生的异常。线程执行?

import threading 
# ... 
def post(self, request, *args, **kwargs): 
    # Some stuff... 
    for message in entry['messaging']: 
     t = threading.Thread(
     target=self.local_handler, 
       args=(message, page_id) 
     ) 
     t.setDaemon(True) 
     t.start() 
    # Some more stuff 

现在,当任何异常情况发生,它不是处理,它会在服务器日志中显示。这样的事情:

Exception in thread Thread-2: 
Traceback (most recent call last): 
... 

有没有办法通过电子邮件接收这些回溯? 在我开始使用线程之前,我正在收到电子邮件,但现在它不再工作。

编辑:

正如@伊万 - miljkovic在他的回答表明linnking了一个类似的问题的解决方案为我工作。

所以,基本上我必须抓住异常的线程函数:

import threading 
from django.core.mail import mail_admins 
# ... 

def local_handler(self, message, page_id): 
    try: 
     # do stuff 
    except: # Any not handled exception will send an email with the traceback 
     import traceback 
     details = traceback.format_exc() 
     mail_admins('Backgrond execption happened', details) 

def post(self, request, *args, **kwargs): 
    # Some stuff... 
    for message in entry['messaging']: 
     t = threading.Thread(
     target=self.local_handler, 
       args=(message, page_id) 
     ) 
     t.setDaemon(True) 
     t.start() 
    # Some more stuff 

回答

2

试试这一个。

当你在线索的调用者中捕捉到它时,可以像以前一样轻松发送电子邮件。

Catch a thread's exception in the caller thread in Python

+0

不错,我把尝试/除了在线程的调用者和它发送电子邮件。你认为我应该删除这个问题,因为它看起来像一个重复的o只是编辑和添加示例? –

+0

我认为这个编辑是可以的。 –