如何让Django信号处理器在遇到异常时不静默失败?
如何让Django的信号处理器在遇到异常时不静默失败?
在使用开发服务器时,有哪个地方可以查看所有这些错误的日志吗?
为什么Django的信号处理器会静默失败呢?这不是违反了Python之禅中的一句话吗?
Python之禅明确指出...
错误不应该静默无声。
这让调试变得非常麻烦。你只能看到信号没有被触发...
我找到过这个问题,但答案对我没什么帮助,因为它非常针对那个问题(答案建议使用pyflakes,而我已经在用pydev,它的静态分析效果不错)
2 个回答
7
没错,错误绝不能悄无声息地发生
是的,我和你想的一样:错误绝不能悄无声息地发生。
Django的内置信号不会悄悄失败
Django的内置信号不会悄悄失败,因为它们使用了send()
这个方法。
只有send_robust()
会忽略异常
关于send_robust()
的说明可以在这里找到。
send_robust()
会捕捉所有来自Python的异常类的错误,并确保所有接收者都能收到信号。如果发生错误,错误实例会以元组的形式返回给引发错误的接收者。
总结
因为Django不使用send_robust()
,所以请检查一下它是在哪里被调用的。我猜可能是在你的源代码里,或者是在某个第三方应用的代码中。
5
在使用 manage.py shell
的时候,我在手动创建 FollowTable 时遇到了一个未捕获的异常。不过,在请求过程中出现的未捕获异常不会在终端显示(除了显示返回了500错误),而是会在浏览器中显示。如果你使用 JavaScript 发起请求,可能需要查看 firebug 或 chrome 开发者工具,看看是否返回了错误追踪信息。
看起来有人已经回答了如何在控制台中显示错误追踪信息: https://stackoverflow.com/a/5886462/725359
这个方法对我有效。我做了以下几步:
- 在
my_app/__init__.py
中添加了ExceptionLoggingMiddleware
类 - 在
settings.py
的MIDDLEWARE_CLASSES
中添加了'my_app.ExceptionLoggingMiddleware'
- 重启了开发服务器