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

Opt*_*mus 18 python django error-handling

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

在使用开发服务器时是否存在记录所有这些错误的位置

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

Python的禅宗明确表示......

错误不应该默默地传递.

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

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

gue*_*tli 6

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

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

内置信号不会无声无息地失败

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

send_robust()忽略异常

来自send_robust() 的文档

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

结论

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


mon*_*onk 5

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

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

似乎对我有用。我做了以下事情:

  1. ExceptionLoggingMiddleware类添加到my_app/__init__.py
  2. 加入'my_app.ExceptionLoggingMiddleware'MIDDLEWARE_CLASSESsettings.py
  3. 重启开发服务器