Шаблоны ошибок в рельсах, поднять «текст, эквивалентный RuntimeError» или поднять MyModule :: CustomError? - PullRequest
0 голосов
/ 24 сентября 2010

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

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

Пример: Я использую httparty , чтобы запросить данные нашего веб-сервиса rails.Он использует базовую аутентификацию.Я вставлю тестовый код и реализацию.Что должен ожидать мой тест: RuntimeError или 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

1 Ответ

2 голосов
/ 24 сентября 2010

В большинстве случаев я бы никогда не спасал бы или поднял 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 увидите, что это сообщение появляется.

...