Django未处理的异常

时间:2009-12-18 02:24:24

标签: python django

它在DEBUG = True模式下运行。有时它会在遇到错误时抛出带有回溯信息的错误消息,但有时它只显示以下行:

Unhandled Exception

An unhandled exception was thrown by the application.

我必须切换到开发服务器才能看到详细消息。

如何在遇到错误时始终显示回溯消息?

4 个答案:

答案 0 :(得分: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)

这将记录整个跟踪。在开发服务器中,它会在控制台中登录。

答案 1 :(得分: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)

答案 2 :(得分:4)

您使用的是Apache吗? 只是出于兴趣,这是您想要查看回溯的生产或开发环境吗?

来自DJango Book on security - Exposed error messages

在Apache和mod_python下部署的用户还应该确保他们的Apache conf文件中有PythonDebug Off;这将确保在Django有机会加载之前发生的任何错误都不会公开显示。

我假设你想要PythonDebug On,建议仅用于开发。

答案 3 :(得分:1)

这就是DEBUG = True的用途:显示完整的追溯。这个想法是普通用户不希望(也不希望他们)看到除了简单错误消息之外的任何其他内容。