2013-01-23 10 views
9

Wie mache ich Django Signalhandler nicht stumm, wenn eine Ausnahme im Handler auftritt?Wie mache ich Django-Signal-Handler nicht stumm, wenn eine Ausnahme im Signal-Handler auftritt?

Gibt es ein Ort, wo all diese Fehler protokolliert werden, während Entwicklungsserver mit?

Warum versagen Django-Signalhandler trotzdem leise? Ist es nicht gegen eine der Linien in Zen von Python?

Zen of Python eindeutig fest ...

Fehler nie still passieren sollte.

Es macht sie zu einem Albtraum zu debuggen. Alles, was Sie sehen können, ist, dass das Signal nicht ausgelöst wird ...

Ich habe this Frage gefunden, aber die Antwort ist nutzlos für mich, da es sehr spezifisch für die Frage ist (Antwort schlägt vor, Pyflakes zu verwenden, verwende ich bereits pydev was tut zufriedenstellende statische Analyse)

+0

Wenn Fehler innerhalb Ihrer Callback-Funktion im Hintergrund versagen, warum testen Sie nicht Ihre Callback-Funktion? Alle Callback-Parameter können leicht verspottet werden, um sicherzustellen, dass Ihre Callback-Funktion fehlerfrei ist. – dm03514

+0

Können Sie einen Testfall erstellen, um dies zu reproduzieren? Ich fand, dass ich Tracebacks vom Entwicklungsserver mit dem folgenden erhielt: http://pastie.org/private/tqd11vmhxvwgpxu65kixg – monk

+0

@ dm03514 Unittests würde der Weg sein zu gehen ... aber ich würde bevorzugen, wenn Signalhandler erhalten würde, Ausnahmen zu werfen , so dass, selbst wenn ein fehleranfälliger Fall während des Schreibens von Unit Tests ignoriert wird, es leicht erkannt wird ... – Optimus

Antwort

2

Bei Verwendung von manage.py shell erhalte ich eine nicht abgefangene Ausnahme, wenn ich manuell eine FollowTable aus Ihrem Beispiel erstelle. Nicht abgefangene Ausnahmen während einer Anfrage werden jedoch nicht im Terminal angezeigt (abgesehen davon, dass 500 zurückgegeben wurde), stattdessen werden sie im Browser angezeigt. Wenn Sie JavaScript verwenden, um Anfragen zu stellen, sollten Sie in den Debugging-Tools von firebug/chrome nachschauen, um zu sehen, ob es eine Rückverfolgung zurückgibt.

Sieht aus wie jemand andere hat geantwortet, wie Tracebacks in der Konsole zu zeigen, zu erhalten: https://stackoverflow.com/a/5886462/725359

Schienen für mich zu arbeiten. Ich habe folgende:

  1. hinzugefügt, um die ExceptionLoggingMiddleware Klasse my_app/__init__.py
  2. Added 'my_app.ExceptionLoggingMiddleware'-MIDDLEWARE_CLASSES in settings.py
  3. die Entwicklung neu gestarteten Server
+0

yup nicht nein, was das Problem war, indem mysql neu gestartet und Entwicklungservers löste es ... danke trotzdem .. – Optimus

1

Ja, Fehler nie still ausfallen sollten

Ja, ich denke wie du: Fehler sollten niemals leise ausfallen

in Signale Errichtet nicht versagen leise

des Django gebaut in Signale nicht still scheitern, weil sie send()

Verwenden Sie nur send_robust() ignoriert Ausnahmen

Docs aus send_robust()

send_robust() fängt alle Fehler ab, die von Pythons Exception-Klasse abgeleitet sind, und stellt sicher, dass alle Empfänger über das Signal benachrichtigt werden.Wenn ein Fehler auftritt, wird die Fehlerinstanz im Tupel-Paar für den Empfänger zurückgegeben, der den Fehler ausgelöst hat.

Fazit

Da django verwendet nicht send_robust() bitte untersuchen, wo es aufgerufen wird. Ich denke, es ist in Ihrem Quellcode oder im Code einer Drittanbieter-App.

Verwandte Themen