modèles d'erreur dans les rails, raise « texte à l'évaluation RuntimeError » ou augmentation MyModule :: Erreur personnalisée?
-
05-10-2019 - |
Question
Q: Le titre est peut-être trop grande question et la réponse est probablement « ça dépend »? Cependant, en fournissant des cas pratiques / exemples devraient aider les développeurs, comme moi-même, reconnaître quand appliquer ce. Je vais commencer avec ma situation particulière. Voulez-vous ou seriez-vous pas utiliser des classes d'erreur personnalisées? Pourquoi pourquoi pas?
D'autres exemples comme celui ci-dessous sont les bienvenus, comme lorsque vous utilisez vos propres classes d'erreur. Je me demande vraiment.
Ex: J'utilise httparty pour interroger notre service Web rails application pour certaines données. Il utilise l'authentification de base. Je vais coller à la fois le code et la mise en œuvre. Que devrait attendre mon test, RuntimeError ou 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
La mise en œuvre:
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
La solution
Dans la plupart des cas, je voudrais jamais sauvetage ou de raiseRuntimeError
. Cela pourrait être quelque chose de complètement sans rapport avec votre code. Il est préférable d'utiliser une exception personnalisée.
En général, vous pouvez appeler les erreurs que vous voulez tant que vous les espaces de noms au sein de la constante de votre bibliothèque. Par exemple, si quelqu'un obtient leur mauvais nom d'utilisateur que vous pourriez avoir YourApp::InvalidUsername
comme un objet d'exception qui serait définie comme ceci:
module YourApp
class InvalidUsername < StandardError
def message
super("Yo dawg, you got your username wrong all up in here")
end
end
end
Lorsque vous raise YourApp::InvalidUsername
vous verrez ce message apparaît.