Skip to content

Неудачи и обработка ошибок

При простом сценарии использования все неудачи (или исключения) сервиса будут возникать из input, internal или output. Это все будет считаться неожиданным поведением в работе сервиса.

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

Метод fail!

Базовый метод fail! позволяет передать текст ошибки, а также дополнительную информацию через атрибут meta.

При вызове сервиса через метод .call! будет происходить исключение с классом Servactory::Errors::Failure.

ruby
make :check!

def check!
  return if inputs.invoice_number.start_with?("AA")

  fail!(message: "Invalid invoice number")
end
ruby
fail!(
  message: "Invalid invoice number",
  meta: {
    invoice_number: inputs.invoice_number
  }
)
ruby
exception.detailed_message  # => Invalid invoice number (ApplicationService::Errors::Failure)
exception.message           # => Invalid invoice number
exception.type              # => :fail
exception.meta              # => {:invoice_number=>"BB-7650AE"}

Метод fail_input!

Отличается от fail! обязательным указыванием имени атрибута input, от лица которого будет создана ошибка.

При вызове сервиса через метод .call! будет вызываться исключение с классом Servactory::Errors::InputError.

ruby
make :check!

def check!
  return if inputs.invoice_number.start_with?("AA")

  fail_input!(:invoice_number, message: "Invalid invoice number")
end