2010-07-21 3 views
1

Je ne demande pas comment utiliser l'instruction begin..rescue dans Ruby. Au contraire, je demande comment vous pouvez comprendre ce qui vaut la peine de s'inquiéter. Je sais que certaines personnes inconditionnelles passent probablement par la documentation/code pour trouver chaque erreur possible, et ont un code qui gère tous les cas avec élégance. Mais cela pourrait aller trop loin si vous n'écrivez pas quelque chose de "critique".Comment rendre vos scripts Ruby robustes avec la gestion correcte des exceptions

Alors, comment savez-vous les erreurs à surveiller? En général, je lance simplement mon code, et s'il s'arrête à cause d'une erreur, j'ajoute une instruction begin..rescue. Je suis sûr qu'il doit y avoir un meilleur moyen cependant. Je viens d'exécuter un script pour importer des données dans une base de données pour certains fichiers, et il s'est arrêté après une heure (beaucoup de fichiers, ne demandent pas) en raison d'une erreur que je ne pouvais pas savoir allait se produire. Assez agaçant, et je suis sûr que c'est de ma faute si je n'écris pas de code plus robuste. Comment je fais ça?

Répondre

2

Je ne suis pas sûr qu'il soit toujours possible de toujours prévoir des exceptions sans les avoir d'abord vécues. Maintenant que vous savez que les bases de données échouent parfois, vous pouvez ajouter une meilleure gestion des exceptions pour cela à l'avenir, mais l'expérience est le seul vrai enseignant dans ce sens.

Cependant, je pense que vous pourriez être un peu trop rapide pour écrire vos propres gestionnaires d'erreurs. Pour le code de production, il y a évidemment certains scénarios que vous voulez attraper facilement et afficher un bon message d'erreur (par exemple, trop de connexions à la base de données), mais parfois laisser flotter l'erreur est en fait la chose la plus robuste. script peut faire. S'il y a quelque chose qui ne va pas dans ma configuration de rubygems qui fait que votre gemme crache des erreurs, je ne veux pas que vous les cachiez derrière "quelque chose s'est mal passé!"; Je préférerais voir l'erreur elle-même pour que je puisse me mettre au travail. Catch les erreurs qui importent vraiment, et que vous pouvez faire quelque chose, comme réessayer une connexion HTTP quelques fois avant d'abandonner. Au-delà de cela, cependant, s'il n'y a rien que vous puissiez faire à propos de l'erreur, il n'y a pas de honte à la laisser flotter.

+0

Le laisser flotter n'a pas de sens pour moi parce que je n'écris pas une bibliothèque. Les erreurs ont déjà flotté dans mon cas, à moins que je ne comprenne mal comment la gestion des exceptions fonctionne dans Ruby (tout à fait possible). Le problème est que les erreurs arrêtent les scripts quand je préfère qu'ils continuent à fonctionner et je peux simplement vérifier les erreurs dans un fichier journal plus tard ou quelque chose. – ehsanul

+3

@ehsanul - il est logique de continuer à courir si vous savez que vous pouvez continuer à courir. Avaler toutes les erreurs est un comportement très dangereux, surtout si l'exception est révélatrice d'un problème critique qui pourrait endommager le système si vous continuez. Mais quand vous savez que le problème n'est que temporaire et qu'il ne s'applique qu'à une tâche isolée, c'est différent ... mais il est extrêmement circonstanciel, et chaque exception individuelle doit être traitée individuellement: / – Matchu