2013-01-23 27 views
9

當處理程序中遇到異常時,如何讓Django信號處理程序不會自動失敗當信號處理程序中遇到異常時,如何讓Django信號處理程序不會默默失敗?

所有這些錯誤,而使用開發服務器登錄的地方嗎?

爲什麼django信號處理程序無聲無息地失敗?是不是違反了Python中的其中一行

的Python的禪明確規定...

的錯誤不應該無聲地傳遞。

這使他們成爲調試的噩夢。所有你可以看到的是,信號沒有被解僱......

我發現this問題,但答案是沒用的,因爲它是非常具體的問題(答案建議使用pyflakes,我已經使用pydev哪令人滿意的靜態分析)

+0

如果你的回調函數內部的錯誤無聲無息,爲什麼你不測試你的回調函數?所有的回調參數都可以輕鬆地模擬出來,以確保你的回調函數沒有錯誤 – dm03514

+0

你可以製作一個測試用例來重現這個嗎?我發現我從開發服務器獲得了以下回溯:http://pastie.org/private/tqd11vmhxvwgpxu65kixg – monk

+0

@ dm03514 Unittests將成爲...但我寧願如果可以讓信號處理程序拋出異常,所以即使在編寫unittests時忽略了一些容易出錯的情況,也很容易檢測到... – Optimus

回答

2

當使用manage.py shell時,在您的示例中手動創建FollowTable時會出現未捕獲的異常。但是,請求期間的未捕獲異常不會顯示在終端中(除了顯示500已返回),而是顯示在瀏覽器中。如果您使用JavaScript來提出請求,您可能需要查看firebug/chrome開發人員工具以查看它是否返回了追溯。

看起來像別人已經回答瞭如何讓回溯到控制檯顯示: https://stackoverflow.com/a/5886462/725359

似乎爲我工作。我做了以下內容:

  1. 添加了ExceptionLoggingMiddlewaremy_app/__init__.py
  2. 新增'my_app.ExceptionLoggingMiddleware'MIDDLEWARE_CLASSESsettings.py
  3. 重新啓動開發服務器
+0

燁不要什麼問題是通過重新啓動MySQL和開發服務器解決了它......謝謝無論如何.. – Optimus

1

是,錯誤應該永遠不會失敗默默

是的,我覺得和你一樣:錯誤應該永遠不會失敗

內置信號不從send_robust()

send_robust失敗默默

Django內置的信號,因爲它們使用send()

不失敗默默只有send_robust()忽略例外

文檔()捕獲從Python的Exception類派生的所有錯誤,並確保所有接收器都被通知信號。如果發生錯誤,則錯誤實例會返回到引發錯誤的接收方的元組對中。

結論

由於Django不使用send_robust()請調查它被調用。我想這是在您的源代碼或第三方應用程序的代碼中。