2010-05-12 4 views
1

Je suis nouveau à Django et ont un code dans mon views.py comme ceci:Django: Comment utiliser assert ... sans afficher une page d'erreur système?

try: 
    myfunction() 
except: 
    assert False, sys.exc_info()[0] 

Ceci est très utile parce que je reçois un e-mail avec beaucoup d'informations utiles s'il y a une erreur. Le problème est qu'il redirige également l'utilisateur vers une page d'erreur du système Webfaction. Ce que je voudrais savoir, c'est comment puis-je toujours obtenir le message d'erreur, mais rediriger l'utilisateur vers ma propre page d'erreur?

Aussi, est-ce la meilleure façon de gérer les erreurs dans Django?

Répondre

4

Ceci est faux sur un bon nombre de niveaux.

Premièrement, il n'y a aucune raison d'attraper une exception seulement pour en déclencher une autre. Si votre application déclenche une exception, alors le middleware de Django l'attrapera, et selon que vous avez ou non DEBUG=True, affichez une page de débogage détaillée ou envoyez l'exception aux utilisateurs mentionnés dans le paramètre ADMINS. Deuxièmement, vous ne devriez jamais avoir une page d'erreur Webfaction - je ne peux même pas imaginer comment cela se passe. Si vous voulez que vos utilisateurs voient une belle page d'erreur, vous devez définir des modèles 404.html et 500.html, ou même des vues complètes de gestion des erreurs si vos besoins sont plus compliqués. Ceci est entièrement expliqué in the documentation.

+0

J'ai sorti l'exception catching, ajouté un template 500.html et tout fonctionne bien. L'utilisateur obtient une belle page d'erreur et je reçois un email avec les détails de l'exception. Si simple - j'aime vraiment Django :-) Merci. – FunLovinCoder

+0

Pas de problème. Ne pas oublier d'accepter la réponse si vous l'avez aimé. –

1

Que diriez-vous d'utiliser mail_admins pour vous poster quand quelque chose est en place?

par exemple

from django.template.loaders import render_to_string 

... 

try: 
    #something cool but edgy here 
except YourFavouriteException, yfe: 
    message_body = render_to_string('path/to/a/template/if/you/want.txt', {'exception': yfe, 'type_of_exception': type(yfe) } ## you could add more detail to this, of course 
    mail_admins('Something exploded', message_body) 
+0

Vous pourriez juste attraper une exception générale ici, plutôt qu'un particulier –

+1

Merci pour votre réponse. – FunLovinCoder

+0

De rien! –

Questions connexes