Шаблоны ошибок в рельсах, поднимите "текст, эквивалентный 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
вы увидите, что сообщение появится.