modèles d'erreur dans les rails, raise « texte à l'évaluation RuntimeError » ou augmentation MyModule :: Erreur personnalisée?

StackOverflow https://stackoverflow.com/questions/3787883

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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top