Ruby reraising exception w / argument de chaîne supplémentaire
Voici la situation. Je veux toutes les exceptions dans doStuff() pour remonter à travers le code de sorte qu'ils sont gérés à un niveau supérieur.
J'aimerais aussi souvent que tout exceptions qui se produisent dans doStuff() à un niveau supérieur en tant que bien, et je suis actuellement en train de faire ceci:
begin
doStuff()
rescue Exception =>
raise e, "specific error to log in a db"
doStuff code de jeter des dizaines d'exceptions, et je veux capturer chacun de ces événements pour mettre dans la db. Il y a un doStuff2(), qui peut également jeter identiques instructions, et je veux savoir quelle fonction ils sont venus.
D'ajouter la chaîne, semble changer l'exception de lui-même, et je perds toute la belle mise en forme et les informations de trace que l'exception d'origine avait.
Des suggestions sur comment je peux relancer l'exception d'origine, mais aussi de garder une trace de toutes les exceptions qui se produisent au sein de doStuff()?
source d'informationauteur Crazy Dan 11 | 2011-08-30
Vous devez vous connecter pour publier un commentaire.
Si vous appelez
raise
sans passer aucun argument, Ruby va re-soulever la dernière exception à la règle.Comme une note de côté, je voudrais vous donner quelques suggestions à propos de Ruby meilleures pratiques.
doStuff()
méthode ne suit pas les Rubis des conventions de nommage. Vous devez utiliser le trait de soulignement pour les méthodes. Veuillez utiliserdo_stuff
. Aussi, pas besoin d'utiliser()
si il n'y a pas d'arguments.Exception
classe est très faible et il va attraper les erreurs de syntaxe, et de plusieurs autres problèmes de compilateur. Vous pourriez laisser le plantage de l'application, dans ce cas, de sorte que vous n'êtes pas le déploiement d'une application défectueuse.Vous pouvez enregistrer la trace et le message de la première exception et de construire une nouvelle exception à élever
Vous ne pouvez pas créer une nouvelle Exception à la règle et enregistrer la précédente exception et de son suivi de pile hors de la boîte. Exceptions imbriquées à partir de Java monde ne sont pas d'ici la sortie de la boîte, malheureusement. Il sera disponible en Ruby 2.1. Il est tout à fait un sujet chaud. https://bugs.ruby-lang.org/issues/8257
Vous pouvez toujours utiliser
nesty
joyau de l'avoir. Ce que vous ne avez besoin est àinclude Nesty::NestedError
dans vos classes d'exception. Plus d'informations ici: https://github.com/skorks/nesty/