modelli di errore nelle rotaie, raise “text valutare a RuntimeError” o rilancio MyModule :: errore personalizzato?

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

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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top