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

Python 当信号处理程序中遇到异常时,如何使Django信号处理程序不以静默方式失败?,python,django,error-handling,Python,Django,Error Handling,当处理程序中遇到异常时,如何使Django信号处理程序不以静默方式失败 在使用开发服务器时,是否有记录所有这些错误的地方 为什么django信号处理程序总是以静默方式失败?这不正是Python禅宗中的一句台词吗 Python之禅明确指出 错误永远不应该悄无声息地过去 这使它们成为调试的噩梦。你能看到的只是信号没有被触发 我发现了这个问题,但答案对我来说是无用的,因为它非常特定于这个问题(答案建议使用pyflakes,我已经使用pydev进行了令人满意的静态分析)当使用manage.py shel

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

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

为什么django信号处理程序总是以静默方式失败?这不正是Python禅宗中的一句台词吗

Python之禅明确指出

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

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


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

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

看起来其他人已经回答了如何在控制台中显示回溯:

似乎对我有用。我做了以下工作:

  • ExceptionLoggingMiddleware
    类添加到
    my_app/\uuuuu init\uuuuuuuuuuuuy.py
  • settings.py中的
    中间件类中添加了
    'my\u app.ExceptionLoggingMiddleware'
  • 重新启动开发服务器
  • 是的,错误永远不应该默默地失败 是的,我和你一样认为:错误永远不应该默默地失败

    内置信号不会自动失效 Django的内置信号不会自动失效,因为它们使用
    send()

    只有
    send\u robust()
    会忽略异常 来自

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

    结论
    由于django不使用
    send\u robust()
    ,请调查它在哪里被调用。我猜这是在您的源代码中,或者在第三方应用程序的代码中。

    如果回调函数中的错误正在悄无声息地失败,为什么不对回调函数进行单元测试?所有的回调参数都可以很容易地模拟,以确保回调函数是无错误的。您可以制作一个测试用例来重现这一点吗?我发现我从开发服务器上得到了如下跟踪:@dm03514 Unittests将是一条可行之路。。。但我更希望if能够让信号处理程序抛出异常,这样即使在编写unittests时忽略了一些容易出错的情况,它也很容易被检测到……此外,如果希望信号不以静默方式失败,可以使用send_robust()而不是send(),如果它是自定义信号。答案“编写单元测试”不是一个好的解决方案。如果一个单元测试因为一个异常被悄悄忽略而失败,那么你可能会浪费数小时来查找这个bug。是的,通过重新启动mysql和development sever解决它,你不知道问题出在哪里。。。无论如何,谢谢你。。