Шаблоны ошибок в рельсах, поднимите "текст, эквивалентный RuntimeError" или поднимите MyModule::CustomError?

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 ответ

Решение

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

Другие вопросы по тегам