modelli di errore nelle rotaie, raise “text valutare a RuntimeError” o rilancio MyModule :: errore personalizzato?
-
05-10-2019 - |
Domanda
D: Il titolo è forse troppo grande di domanda e la risposta probabilmente è "dipende"? Tuttavia, fornendo alcuni casi pratici / esempi dovrebbero aiutare gli sviluppatori, come il sottoscritto, riconoscono quando applicare ciò. Comincerò con la mia situazione particolare. Volete o se non utilizzare le classi di errore personalizzate? Perché perché no?
Altri esempi come quello qui sotto sono accolti, come quando si usa le proprie classi di errore. Mi chiedo davvero.
Esempio: che sto utilizzando httparty per interrogare il nostro servizio rotaie web app per alcuni dati. Esso utilizza l'autenticazione di base. Io incollo sia il codice di test e implementazione. Cosa deve aspettarsi la mia prova, RuntimeError o 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
L'implementazione:
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
Soluzione
Nella maggior parte dei casi, lo farei non di salvataggio da o raiseRuntimeError
. Questo potrebbe essere qualcosa di completamente estranei al codice. E 'meglio utilizzare un eccezione personalizzata.
In generale, è possibile chiamare gli errori di quello che volete fintanto che li namespace all'interno costante della tua biblioteca. Ad esempio, se qualcuno ottiene il loro nome utente sbagliato si potrebbe avere YourApp::InvalidUsername
come un oggetto eccezione che sarebbe definita in questo modo:
module YourApp
class InvalidUsername < StandardError
def message
super("Yo dawg, you got your username wrong all up in here")
end
end
end
Quando si raise YourApp::InvalidUsername
vedrete apparire il messaggio.