Je me demandais si les gens partageraient leurs meilleures pratiques/stratégies sur la gestion des exceptions & erreurs. Maintenant, je ne demande pas quand lancer une exception (il a été répondu tridement ici: SO: When to throw an Exception). Et je n'utilise pas cela pour mon flux d'applications - mais il y a des exceptions légitimes qui se produisent tout le temps. Par exemple, le plus populaire serait ActiveRecord :: RecordNotFound. Quelle serait la meilleure façon de le gérer? La façon DRY?Quelle est la meilleure stratégie pour gérer les exceptions et les erreurs dans Rails?
En ce moment je fais beaucoup de contrôle dans mon contrôleur si Post.find(5)
renvoie Nil - Je vérifie pour cela et envoie un message flash. Cependant, bien que ce soit très granulaire - c'est un peu lourd dans un sens que j'ai besoin de vérifier des exceptions comme ça dans chaque contrôleur, alors que la plupart d'entre eux sont essentiellement les mêmes et concernent des enregistrements non trouvés ou connexes non trouvés - tels comme Post.find(5)
introuvable ou si vous essayez d'afficher des commentaires liés à la publication qui n'existe pas, cela créerait une exception (quelque chose comme Post.find(5).comments[0].created_at
)
Je sais que vous pouvez faire quelque chose comme ça dans ApplicationController et l'écraser plus tard dans un contrôleur particulier/méthode pour obtenir un soutien plus granulaire, mais ce serait une bonne façon de le faire?
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordInvalid do |exception|
render :action => (exception.record.new_record? ? :new : :edit)
end
end
Aussi cela fonctionnerait en cas Post.find(5)
pas trouvé, mais qu'en est-Post.find(5).comments[0].created_at
- Je voulais dire que je ne peux pas lancer une exception épanouie si le poste existe, mais n'a pas de commentaires, non?
Pour résumer jusqu'à présent, je faisais beaucoup de vérifications manuelles en utilisant if/else/unless ou case/when (et j'avoue occasionnellement commencer/rescue) et en vérifiant zéro? ou vide ?, etc, mais il doit y avoir une meilleure façon, il semble.
: REPONSES
@Milan: Salut Milan Merci pour avoir une réponse - Je suis d'accord avec ce que vous avez dit, et je pense que j'abusé l'exception des mots. Ce que je voulais dire est que en ce moment je fais beaucoup de choses comme:
if Post.exists?(params[:post_id])
@p = Post.find(params[:post_id])
else
flash[:error] = " Can't find Blog Post"
end
Et je fais beaucoup de ce genre de « gestion des exceptions », je tente d'éviter d'utiliser begin/sauvetage. Mais il me semble que c'est un résultat/une vérification/une situation assez commun qu'il devrait y avoir un moyen plus sûr de le faire, n'est-ce pas? Comment feriez-vous ce genre de vérification?
Aussi comment le gérer dans ce cas? Disons que vous voulez afficher la date de création commentaire à votre avis:
Last comment for this post at : <%= @post.comments[0].created_at %>
Et ce poste n'a pas de commentaires. Vous pouvez faire
Last comment for this post at : <%= @post.comments.last.created_at unless @post.comments.empty? %>
Vous pouvez faire une vérification dans le contrôleur. Etc. Il y a plusieurs façons de le faire. Mais quel est le "meilleur" moyen de gérer cela?
S'il vous plaît - voir ma réponse ci-dessus dans la réponse - je ne peux pas poster le code correctement échancré dans les commentaires :-) – konung
Hey Nick, désolé pour le sondage si Ranty. Je n'ai tout simplement pas eu le temps d'ajouter une partie constructive à ma réponse. Maintenant, c'est là. J'espère que tout le monde répondra que c'est plus utile maintenant. –
Pas de problème - aucune offense prise, ma question n'était pas très claire non plus - jusqu'à ce que je l'ai nettoyé. Vous m'avez donné quelques bons conseils - je vais juste attendre un peu, peut-être que quelqu'un a quelques suggestions de plus et je marquerai cela comme une réponse. Merci pour une réponse détaillée. :-) – konung