2017-04-03 61 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

我認爲這個編輯是可以的。 –