20

当处理程序中遇到异常时,如何使 Django 信号处理程序不会静默失败?

使用开发服务器时是否有记录所有这些错误的地方

为什么 django 信号处理程序无论如何都会默默地失败?这不是与Python Zen 中的一条线相悖吗?

Python之禅明确指出......

错误永远不应该悄无声息地过去。

这使它们成为调试的噩梦。你所看到的只是信号没有被触发......

我发现了这个问题,但答案对我来说没用,因为它对问题非常具体(答案建议使用 pyflakes,我已经使用了 pydev,它可以进行令人满意的静态分析)

4

2 回答 2

6

是的,错误永远不应该默默地失败

是的,我和你一样想:错误永远不应该默默地失败

内置信号不会静默失败

Django 的内置信号不会静默失败,因为它们使用send()

send_robust()忽略异常

来自send_robust()的文档

send_robust() 捕获从 Python 的 Exception 类派生的所有错误,并确保所有接收者都收到信号通知。如果发生错误,则在引发错误的接收者的元组对中返回错误实例。

结论

由于 django 不使用send_robust(),请调查它被调用的位置。我猜它在您的源代码中,或者在第三方应用程序的代码中。

于 2017-01-24T12:29:10.707 回答
5

使用manage.py shell时,从您的示例手动创建 FollowTable 时出现未捕获的异常。但是,请求期间未捕获的异常不会显示在终端中(除了显示返回 500),而是显示在浏览器中。如果您使用 JavaScript 发出请求,您可能需要查看 firebug/chrome 开发人员工具,看看它是否返回了回溯。

看起来其他人已经回答了如何在控制台中显示回溯: https ://stackoverflow.com/a/5886462/725359

似乎为我工作。我做了以下事情:

  1. 将课程添加ExceptionLoggingMiddlewaremy_app/__init__.py
  2. 添加'my_app.ExceptionLoggingMiddleware'MIDDLEWARE_CLASSES_settings.py
  3. 重启开发服务器
于 2013-01-23T14:55:39.477 回答