Django 未处理异常

9 投票
4 回答
17075 浏览
提问于 2025-04-15 17:09

现在它是在DEBUG = True模式下运行。有时候,当遇到错误时,它会显示一个错误信息和详细的追踪信息,但有时候它只会显示以下几行:

Unhandled Exception

An unhandled exception was thrown by the application.

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

我该怎么做才能在遇到错误时总是显示追踪信息呢?

4 个回答

4

你在用Apache吗?
我只是好奇,你想查看错误追踪信息的是生产环境还是开发环境?

根据《Django安全书籍 - 暴露的错误信息》

在Apache和mod_python下运行的用户,应该确保在Apache的配置文件中把PythonDebug设置为关闭;这样可以确保在Django加载之前发生的任何错误不会被公开显示。

我猜你想把PythonDebug设置为开启,这个设置只推荐在开发环境中使用。

10

只需要连接到 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)

这样就会记录下完整的错误追踪信息。在开发服务器上,它会在控制台显示出来。

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)

撰写回答