如何让Django信号处理器在遇到异常时不静默失败?

22 投票
2 回答
4624 浏览
提问于 2025-04-17 13:24

如何让Django的信号处理器在遇到异常时不静默失败

在使用开发服务器时,有哪个地方可以查看所有这些错误的日志吗?

为什么Django的信号处理器会静默失败呢?这不是违反了Python之禅中的一句话吗?

Python之禅明确指出...

错误不应该静默无声。

这让调试变得非常麻烦。你只能看到信号没有被触发...

我找到过这个问题,但答案对我没什么帮助,因为它非常针对那个问题(答案建议使用pyflakes,而我已经在用pydev,它的静态分析效果不错)

2 个回答

7

没错,错误绝不能悄无声息地发生

是的,我和你想的一样:错误绝不能悄无声息地发生。

Django的内置信号不会悄悄失败

Django的内置信号不会悄悄失败,因为它们使用了send()这个方法。

只有send_robust()会忽略异常

关于send_robust()的说明可以在这里找到。

send_robust()会捕捉所有来自Python的异常类的错误,并确保所有接收者都能收到信号。如果发生错误,错误实例会以元组的形式返回给引发错误的接收者。

总结

因为Django不使用send_robust(),所以请检查一下它是在哪里被调用的。我猜可能是在你的源代码里,或者是在某个第三方应用的代码中。

5

在使用 manage.py shell 的时候,我在手动创建 FollowTable 时遇到了一个未捕获的异常。不过,在请求过程中出现的未捕获异常不会在终端显示(除了显示返回了500错误),而是会在浏览器中显示。如果你使用 JavaScript 发起请求,可能需要查看 firebug 或 chrome 开发者工具,看看是否返回了错误追踪信息。

看起来有人已经回答了如何在控制台中显示错误追踪信息: https://stackoverflow.com/a/5886462/725359

这个方法对我有效。我做了以下几步:

  1. my_app/__init__.py 中添加了 ExceptionLoggingMiddleware
  2. settings.pyMIDDLEWARE_CLASSES 中添加了 'my_app.ExceptionLoggingMiddleware'
  3. 重启了开发服务器

撰写回答