2013-01-23 9 views
9

Come faccio a fare in modo che i gestori di segnale Django non falliscano in modo silenzioso quando si verifica un'eccezione nel gestore?Come faccio a fare in modo che i gestori di segnale Django non falliscano silenziosamente quando si verifica un'eccezione nel gestore di segnale?

C'è un luogo in cui tutti questi errori vengono registrati durante l'utilizzoserver di sviluppo?

Perché i gestori di segnale django falliscono comunque in modo silenzioso? Non è contro una delle linee in Zen of Python?

Zen di Python afferma chiaramente ...

errori non devono mai passare in silenzio.

Li rende un incubo per il debug. Tutto quello che puoi vedere è che il segnale non viene sparato ...

Ho trovato la domanda this ma la risposta è inutile per me in quanto è molto specifica alla domanda (la risposta suggerisce l'uso di pyflakes, io uso già pydev che fa soddisfacente analisi statica)

+0

se gli errori all'interno della funzione di callback non funzionano correttamente, perché non si disattiva la funzione di richiamata? tutti i parametri di callback possono essere facilmente derisi per garantire che la funzione di callback sia priva di errori – dm03514

+0

Puoi creare una testcase per riprodurre questo? Ho scoperto di avere dei traceback dal server di sviluppo con il seguente: http://pastie.org/private/tqd11vmhxvwgpxu65kixg – monk

+0

@ dm03514 Unittests sarebbe la strada da percorrere ... ma preferirei se fosse possibile che i gestori di segnale generassero eccezioni , così anche se qualche caso soggetto a errori viene ignorato durante la scrittura di unittests, viene facilmente rilevato ... – Optimus

risposta

2

Quando si utilizza manage.py shell Ottengo un'eccezione non rilevata quando si crea manualmente un FollowTable dall'esempio. Tuttavia, le eccezioni non rilevate durante una richiesta non vengono visualizzate nel terminale (oltre a mostrare che 500 è stato restituito), ma vengono visualizzate nel browser. Se stai usando JavaScript per fare richieste potresti voler guardare negli strumenti per sviluppatori firebug/chrome per vedere se restituisce un traceback.

Sembra che qualcun altro ha risposto come raggiungere traceback per mostrare nella console: https://stackoverflow.com/a/5886462/725359

sembrava funzionare per me. Ho fatto la seguente:

  1. Aggiunto classe ExceptionLoggingMiddleware-my_app/__init__.py
  2. Aggiunto 'my_app.ExceptionLoggingMiddleware'-MIDDLEWARE_CLASSES in settings.py
  3. riavviato il server di sviluppo
+0

sì no non è stato il problema, riavviando mysql e sviluppo sever risolto ... grazie comunque .. – Optimus

1

Sì, gli errori non dovrebbe mai mancare in silenzio

Sì, penso come te: gli errori non dovrebbero mai fallire silenziosamente

Costruito nel segnali non mancate silenziosamente

costruiti in segnali non mancano in silenzio perché usano send()

Solo send_robust() ignora eccezioni di Django

Documenti da send_robust()

send_robust() intercetta tutti gli errori derivati ​​dalla classe Exception di Python e garantisce che tutti i ricevitori ricevano la notifica del segnale.Se si verifica un errore, l'errore viene restituito nella coppia di tuple per il ricevitore che ha generato l'errore.

Conclusione

Dal Django non usa send_robust() si prega di indagare dove viene chiamato. Immagino sia nel codice sorgente o nel codice di un'app di terze parti.

Problemi correlati