Шаблоны ошибок в рельсах, поднять «Текст, оценивая runtimeError» или Rosing MyModule :: CustomError?
-
05-10-2019 - |
Вопрос
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
Вы увидите, что появится сообщение.