Fehlermuster in Schienen, raise „Text zu Runtime Auswertung“ oder Raise MyModule :: Custom Error?
-
05-10-2019 - |
Frage
F: Der Titel ist vielleicht zu groß die Frage und die Antwort ist wahrscheinlich „es kommt“? Allerdings sollten einige praktische Fälle / Beispiele bieten Entwicklern helfen, wie ich, zu erkennen, wenn das anzuwenden, was. Ich werde mit meiner besonderen Situation beginnen. Würden Sie oder würden Sie nicht benutzerdefinierte Fehlerklassen verwenden? Warum Warum nicht?
Weitere Beispiele, wie die unten sind willkommen, wie wenn Sie Ihre eigenen Fehlerklassen verwenden würden. Ich bin wirklich fragen.
Beispiel: Ich verwende httparty Abfrage unserer Schienen Web-Service App für einige Daten. Es verwendet Standardauthentifizierung. Ich werde beide Testcode und Implementierung einfügen. Was sollte mein Test erwarten, Runtime oder SomeCustomError
class MyIntegrationTest < Test::Unit::TestCase
context "connecting to someapp web service" do
should "raise not authorized if username is wrong" do
#get default MyWebserviceInterface instance, overriding username setting
ws_endpoint = build_integration_object(:username => 'wrong_username')
assert_raises RuntimeError do #TODO error design pattern?
ws_endpoint.get
end
end
end
end
Die Umsetzung:
class MyWebserviceInterface
include HTTParty
#Basic authentication and configurable base_uri
def initialize(u, p, uri)
@auth = {:username => u, :password => p}
@uri = uri
end
def base_uri
HTTParty.normalize_base_uri(@uri)
end
def get(path = '/somepath.xml', query_params = {})
opts = {:base_uri => base_uri, :query => query_params, :basic_auth => @auth}
response = self.class.get(path, opts)
evaluate_get_response(response)
response.parsed_response
end
def evaluate_get_response(response)
code = response.code
body = response.body
if code == 200
logger.debug "OK - CREATED code #{code}"
else
logger.error "expected code 200, got code #{code}. Response body: #{body}"
#TODO error design pattern? raise the above logged msg or a custom error?
raise SomeAppIntegration::Error(code, body)
end
end
Lösung
In den meisten Fällen würde ich nie Rettung aus oder raiseRuntimeError
. Das könnte etwas völlig unabhängig von Ihrem Code sein. Es ist am besten, eine benutzerdefinierte Ausnahme zu verwenden.
Im Allgemeinen können Sie Fehler nennen, wie Sie wollen, solange Sie Namespace sie in Ihrer Bibliothek konstant. Zum Beispiel, wenn jemand ihre Benutzername falsch bekommt könnten Sie YourApp::InvalidUsername
als Ausnahme zum Gegenstand haben, die wie folgt definiert werden würden:
module YourApp
class InvalidUsername < StandardError
def message
super("Yo dawg, you got your username wrong all up in here")
end
end
Ende
Wenn Sie raise YourApp::InvalidUsername
Sie werden sehen, dass Meldung angezeigt.