Existe-t-il une meilleure pratique pour définir des types d'erreur personnalisés dans une bibliothèque Ruby (gem) ou une application Ruby on Rails? Plus précisément:
- Quelle est leur place structurelle dans le projet? Un fichier séparé, en ligne avec la définition de module / classe appropriée, ailleurs?
- Y a-t- il des conventions qui établissent quand à et quand ne pas créer un nouveau type d'erreur?
Différentes bibliothèques ont différentes façons de faire les choses, et je n'ai pas remarqué de vrais modèles. Certaines bibliothèques utilisent toujours des types d'erreur personnalisés tandis que d'autres ne les utilisent pas du tout; certains ont toutes les erreurs d'extension StandardError tandis que d'autres ont des hiérarchies imbriquées; certains ne sont que des définitions de classe vides, d'autres ont toutes sortes d'astuces intelligentes.
Oh, et juste parce que j'ai envie d'appeler ces «types d'erreur» est un peu ambigu, ce que je veux dire, c'est ceci:
class AuthenticationError < StandardError; end
class InvalidUsername < AuthenticationError; end
la source
httparty
: github.com/jnunemaker/httparty/blobExceptions
module?/lib
ce n'est peut-être pas le lieu des erreurs. Ils sont très spécifiques aux applications et j'ai l'impression que le code que je mets/lib
est censé être du code qui pourrait être réutilisé dans d'autres applications.Unable to autoload constant Exceptions, expected /app/lib/exceptions.rb to define it
l'autre option serait une classe par exception, je penseJe pense que pour avoir des fichiers source cohérents dans votre projet, vous devez définir des erreurs dans la classe dans laquelle peuvent les jeter et nulle part ailleurs.
Une certaine hiérarchie peut être utile - les espaces de noms sont bons pour garder les chaînes redondantes hors des noms de types - mais c'est plus une question de goût - il n'est pas nécessaire d'aller trop loin à condition que vous ayez au moins un type d'exception personnalisé dans votre application que vous utilisez pour différencier entre les cas d'exception «intentionnels» et «accidentels».
la source
dans les rails, vous pouvez créer un
app/errors
répertoireredémarrez spring / server et il devrait le récupérer
la source
raise FooError, "Example message..."
ouraise FooError.new("Example message...")
C'est une vieille question, mais je voulais partager comment je gère les erreurs personnalisées dans Rails, y compris l'attachement de messages d'erreur, les tests et comment gérer cela avec des
ActiveRecord
modèles.Création d'une erreur personnalisée
Test (minitest)
Avec ActiveRecord
Je pense qu'il vaut la peine de noter que si vous travaillez avec un
ActiveRecord
modèle, un modèle populaire consiste à ajouter une erreur au modèle comme décrit ci-dessous, afin que vos validations échouent:Lorsque les validations sont exécutées, cette méthode se greffera sur la
ActiveRecord::RecordInvalid
classe d'erreur d'ActiveRecord et entraînera l'échec des validations.J'espère que cela t'aides!
la source
Pour vous assurer que le chargement automatique fonctionne comme prévu dans Rails 4.1.10 pour plusieurs classes d'erreur personnalisées, vous devrez spécifier des fichiers séparés pour chacune. Cela devrait fonctionner en développement avec son rechargement dynamique.
Voici comment je configure les erreurs dans un projet récent:
Dans
lib/app_name/error/base.rb
et dans les erreurs personnalisées ultérieures, comme dans
lib/app_name/error/bad_stuff.rb
Vous devriez alors pouvoir appeler vos erreurs via:
la source
lib/app_name/error.rb
uninitialized constant MyController::AppName
. J'appelle augmenter dans mon contrôleur