2009-12-18 63 views
9

它在DEBUG = True模式下運行。有時遇到錯誤時,它可以拋出與追溯信息的錯誤信息,但有時它只是顯示以下行:Django未處理異常

Unhandled Exception 

An unhandled exception was thrown by the application. 

我要切換到開發服務器,看看詳細消息。

如何在遇到錯誤時始終顯示回溯消息?

+0

因此,顯示的錯誤是不一致的,有什麼模式顯示哪些錯誤,哪些不是? – 2009-12-18 04:06:21

+0

你是如何爲網站提供服務的?你在Nginx下面說,但它是FastCGI嗎? – 2009-12-18 14:55:47

回答

6

也許你可以使用這個片段中,這將在Apache的日誌記錄異常:

utils.py

def log_traceback(exception, args): 
    import sys, traceback, logging 
    exceptionType, exceptionValue, exceptionTraceback = sys.exc_info() 
    logging.debug(exception) 
    logging.debug(args) 
    for tb in traceback.format_exception(exceptionType, exceptionValue, exceptionTraceback): 
     logging.debug(tb) 

site_logging.py

import logging 
import sys 

logger = logging.getLogger('') 
logger.setLevel(logging.DEBUG) 
handler = logging.StreamHandler(sys.stderr) 
handler.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(levelname)-8s %(message)s') 
handler.setFormatter(formatter) 
logger.addHandler(handler) 

把它放在你settings.py

import site_logging 

並在代碼:

from where.is.your.utils import log_traceback 
try: 
    `do something` 
except Exception, args: 
    log_traceback(Exception, args) 
1

這就是DEBUG = True的意思:顯示完整的回溯。這個想法是,普通用戶不希望(也不希望他們)只看到一個簡單的錯誤信息。

+0

在500-debug-page處理之外發生了某些錯誤,您仍然從Web服務器收到原始錯誤。 – 2009-12-18 14:55:13

+0

是的,我也注意到有時我得到mod_python錯誤頁面而不是Django頁面。 – JAL 2010-01-12 03:23:59

3

您使用的是Apache嗎?
只是出於興趣,這是您的生產或開發環境,你想看到追溯?

DJango Book on security - Exposed error messages

用戶的Apache和mod_python下部署還應該確保他們有PythonDebug關在自己的Apache conf文件;這將確保Django之前發生的任何錯誤都有機會加載,不會公開顯示。

我假設你想要PythonDebug On,這僅推薦用於開發。

+0

@Ralph,我正在使用Nginx。 – jack 2009-12-18 03:02:03

+0

我在PythonDebug Off中使用mod_python,我仍然可以在我的設置中切換DEBUG = True以快速排查問題。它仍然給我一個方便的django調試頁面,而不是apache的500內部服務器錯誤頁面。 – 2009-12-18 03:04:36

+0

對不起傑克,還沒有用過Nginx,所以也許有人用Nginx可能能夠幫助解決問題。布蘭登 - 這可能是Nginx特有的嗎? – 2009-12-18 04:05:04

9

只要連接到got_request_exception信號,並記錄異常:

from django.core.signals import got_request_exception 
import logging  

def log(*args, **kwargs): 
    logging.exception('error') 

got_request_exception.connect(log) 

這將記錄整個跟蹤。在dev服務器中,它會登錄控制檯。