如何捕获python threading.Thread执行中发生的异常?

时间:2017-04-03 14:58:59

标签: python django multithreading exception-handling

基本上我希望在Thread内部发生未处理的异常时使用Django mail_admins收到一封电子邮件。目前,我有一个处理发布请求的视图,它看起来像:

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):
...

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

修改

正如@ ivan-miljkovic在他的回答中提到的那样,一个类似的问题解决了这个问题。

所以,基本上我必须在线程函数中捕获异常:

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('Background exception 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

1 个答案:

答案 0 :(得分:2)

试试这个。

当你在线程的来电者中捕获它时,你可以像以前一样轻松发送电子邮件。

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