Шаблоны ошибок в рельсах, поднять «Текст, оценивая runtimeError» или Rosing MyModule :: CustomError?

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

Вопрос

Q: Название, возможно, слишком большой вопрос, а ответ, вероятно, «это зависит»? Тем не менее, предоставляя некоторые практические случаи / примеры должны помочь разработчикам, как я, признаю, когда применить то, что. Я начну с моей конкретной ситуацией. Вы бы не использовали пользовательские классы ошибок? Почему, почему нет?

Другие примеры, как приведены ниже, вроде бы, когда вы будете использовать свои собственные классы ошибок. Мне очень интересно.

Бывший: я использую happarty. Чтобы запросить наше приложение Web Service для некоторых данных. Он использует базовую аутентификацию. Я влющу оба тестового кода и реализацию. Что следует ожидать моего теста, Ошибка выполнения или 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

Реализация:

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
Это было полезно?

Решение

В большинстве случаев я бы никогда спасение или поднятьRuntimeError. Отказ Это может быть что-то совершенно не связанное с вашим кодом. Лучше всего использовать пользовательские исключения.

Как правило, вы можете вызвать ошибки, все, что вы хотите, пока вы называете их пространством в пределах вашей библиотеки. Например, если кто-то получает свое имя пользователя не так, вы могли бы иметь YourApp::InvalidUsername В качестве объекта исключения, который будет определен следующим образом:

module YourApp
  class InvalidUsername < StandardError
    def message
      super("Yo dawg, you got your username wrong all up in here")
    end
  end

конец

Когда ты raise YourApp::InvalidUsername Вы увидите, что появится сообщение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top