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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top