Gibt es eine bewährte Methode zum Definieren benutzerdefinierter Fehlertypen in einer Ruby-Bibliothek (Gem) oder einer Ruby on Rails-Anwendung? Speziell:
- Wo gehören sie strukturell in das Projekt? Eine separate Datei, die mit der entsprechenden Modul- / Klassendefinition versehen ist, woanders?
- Gibt es Konventionen , die festlegen , wann zu und wenn nicht zu einem neuen Fehlertyp erstellen?
Verschiedene Bibliotheken haben unterschiedliche Methoden, und ich habe keine wirklichen Muster bemerkt. Einige Bibliotheken verwenden immer benutzerdefinierte Fehlertypen, während andere diese überhaupt nicht verwenden. Einige haben alle Fehler, die StandardError erweitern, während andere verschachtelte Hierarchien haben. Einige sind nur leere Klassendefinitionen, andere haben alle möglichen cleveren Tricks.
Oh, und nur weil ich das Gefühl habe, diese "Fehlertypen" zu nennen, ist das mehrdeutig. Ich meine Folgendes:
class AuthenticationError < StandardError; end
class InvalidUsername < AuthenticationError; end
quelle
httparty
: github.com/jnunemaker/httparty/blob/…Exceptions
Modul einordnen?/lib
möglicherweise nicht der Ort für Fehler ist. Sie sind sehr anwendungsspezifisch und ich habe den Eindruck, dass der von mir eingegebene/lib
Code Code ist, der in anderen Anwendungen wiederverwendet werden kann.Unable to autoload constant Exceptions, expected /app/lib/exceptions.rb to define it
die andere Option eine Klasse pro Ausnahme, denke ichIch denke, um zusammenhängende Quelldateien in Ihrem Projekt zu haben, sollten Sie Fehler in der Klasse definieren, in die sie möglicherweise geworfen werden, und nirgendwo anders.
Einige Erben können hilfreich sein - Namespaces sind gut darin, redundante Zeichenfolgen von Typnamen fernzuhalten - aber das ist eher Geschmackssache - Sie müssen nicht über Bord gehen, vorausgesetzt, Sie haben mindestens einen benutzerdefinierten Ausnahmetyp in Ihrer App, den Sie zur Unterscheidung verwenden zwischen "vorsätzlichen" und "zufälligen" Ausnahmefällen.
quelle
In Schienen können Sie
app/errors
Verzeichnis erstellenStarten Sie Spring / Server neu und es sollte es aufnehmen
quelle
raise FooError, "Example message..."
oderraise FooError.new("Example message...")
Dies ist eine alte Frage, aber ich wollte mitteilen, wie ich mit benutzerdefinierten Fehlern in Rails umgehe, einschließlich Anhängen von Fehlermeldungen, Testen und wie dies mit
ActiveRecord
Modellen behandelt wird.Benutzerdefinierten Fehler erstellen
Testen (am wenigsten)
Mit ActiveRecord
Ich denke, es ist erwähnenswert, dass bei der Arbeit mit einem
ActiveRecord
Modell ein beliebtes Muster darin besteht, dem Modell einen Fehler hinzuzufügen, wie unten beschrieben, damit Ihre Validierungen fehlschlagen:Wenn Validierungen ausgeführt werden, wird diese Methode auf die
ActiveRecord::RecordInvalid
Fehlerklasse von ActiveRecord zurückgesetzt und führt dazu, dass Validierungen fehlschlagen.Hoffe das hilft!
quelle
Um sicherzustellen, dass das automatische Laden in Rails 4.1.10 für mehrere benutzerdefinierte Fehlerklassen wie erwartet funktioniert, müssen Sie für jede Klasse separate Dateien angeben. Dies sollte in der Entwicklung mit seinem dynamischen Nachladen funktionieren.
So richte ich Fehler in einem aktuellen Projekt ein:
Im
lib/app_name/error/base.rb
und in nachfolgenden benutzerdefinierten Fehlern, wie in
lib/app_name/error/bad_stuff.rb
Sie sollten dann in der Lage sein, Ihre Fehler aufzurufen über:
quelle
lib/app_name/error.rb
uninitialized constant MyController::AppName
. Ich rufe Raise in meinem Controller an