【问题标题】:How do I make Django signal handlers not fail silently when an exception is encountered in the signal handler?当信号处理程序中遇到异常时,如何使 Django 信号处理程序不会静默失败?
【发布时间】:2013-01-07 00:30:55
【问题描述】:

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

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

为什么 django 信号处理程序无论如何都会默默地失败?这不是违反Python 之禅中的一句话吗?

Zen of Python 明确指出...

错误不应该默默地过去。

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

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

【问题讨论】:

  • 如果你的回调函数内部的错误无声无息地失败,你为什么不对你的回调函数进行单元测试呢?所有回调参数都可以轻松模拟,以确保您的回调函数没有错误
  • 你能做一个测试用例来重现这个吗?我发现我从开发服务器获得了以下信息:pastie.org/private/tqd11vmhxvwgpxu65kixg
  • @dm03514 单元测试将是要走的路......但我更喜欢如果可以让信号处理程序抛出异常,这样即使在编写单元测试时忽略了一些容易出错的情况,它也很容易检测到...
  • 如果您希望信号不会静默失败,如果它是自定义信号,您可以使用 send_robust instead() of send()。 docs.djangoproject.com/en/dev/topics/signals/…
  • 答案“写单元测试”不是一个好的解决方案。如果单元测试由于异常被静默忽略而失败,您可能会浪费数小时来查找错误。

标签: python django error-handling


【解决方案1】:

是的,错误永远不会失败

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

内置信号不会静默失败

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

只有send_robust() 会忽略异常

来自send_robust()的文档

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

结论

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

【讨论】:

    【解决方案2】:

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

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

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

    1. ExceptionLoggingMiddleware 类添加到my_app/__init__.py
    2. settings.py 中将'my_app.ExceptionLoggingMiddleware' 添加到MIDDLEWARE_CLASSES
    3. 重新启动开发服务器

    【讨论】:

    • 是的,不知道问题是什么,通过重新启动 mysql 和开发服务器解决了它......无论如何,谢谢......
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2017-11-13
    相关资源
    最近更新 更多