当信号处理程序遇到异常时,如何使Django信号处理程序不会无声地失败?

时间:2013-01-23 13:44:16

标签: python django error-handling

当处理程序中遇到异常时,如何使Django信号处理程序无法静默

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

为什么django信号处理程序无论如何都会无声地失败?是不是反对 Python的

中的一行?

  

Python的禅 明确说明......

     

错误绝不应该以无声方式传递。

这使得它们成为调试的噩梦。你只能看到信号没有被解雇......

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

2 个答案:

答案 0 :(得分:4)

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

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

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

  1. ExceptionLoggingMiddleware课程添加到my_app/__init__.py
  2. 'my_app.ExceptionLoggingMiddleware'
  3. 中向MIDDLEWARE_CLASSES添加了settings.py
  4. 重新启动开发服务器

答案 1 :(得分:2)

是的,错误永远不会无声地失败

是的,我想和你一样:错误永远不会无声地失败

内置信号不会无声地失败

Django的内置信号不会因为使用send()

而无声地失败

send_robust()忽略异常

来自send_robust()的文档

  

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

结论

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