Что делает ключевое слово fail в Ruby?

Я изучаю Ruby и встречаю ключевое слово fail. Что это значит?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end

Ответ 1

В Ruby fail является синонимом raise. Ключевое слово fail - это метод модуля Kernel, который входит в класс Object. Метод fail вызывает ошибку времени выполнения, как и ключевое слово raise.

Метод fail имеет три перегрузки:

  • fail: поднимает a RuntimeError без сообщения об ошибке.

  • fail(string): поднимает a RuntimeError со строковым аргументом как сообщение об ошибке:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): возникает исключение класса exception (первый аргумент) с необязательным сообщением об ошибке (второй аргумент) и информацией обратного вызова (третий аргумент).

    Пример. Предположим, что вы определяете функцию, которая должна завершиться неудачей, если задан неверный аргумент. Лучше поднять ArgumentError, а не a RuntimeError:

    fail ArgumentError, "Illegal String"
    

    Другой пример: вы можете передать весь backtrace метод fail, чтобы вы могли получить доступ к трассе внутри блока rescue:

    fail ArgumentError, "Illegal String", caller
    

    caller - это метод Kernel, который возвращает backtrace как массив строк в форме file:line: in 'method'.

Без аргументов возникает исключение в $! или создает RuntimeError если $! равен нулю. С одним аргументом String возникает RuntimeError с строкой в ​​виде сообщения. В противном случае первый параметр должен быть имя класса Exception (или объект, который возвращает исключение объект при отправке сообщения об исключении). Дополнительный второй параметр устанавливает сообщение, связанное с исключением, а третье Параметр представляет собой массив информации обратного вызова. Исключения пойманы с помощью команды rescue begin... end blocks.

Источник: Ruby Documentation на модуле ядра.

Ответ 2

fail == raise

Другими словами, fail является просто популярным псевдонимом для метода повышения точности raise. Использование:

fail ArgumentError, "Don't argue with me!"

Ответ 3

Rubocop говорит об использовании обоих слов;

'Используйте fail вместо raise, чтобы сигнализировать исключения.'

'Используйте raise вместо fail для восстановления исключений.'

Вот пример.

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end

Ответ 4

www.ruby-doc.org является вашим другом. Когда я googled rubydoc fail " Kernel" был первым хитом. Мой совет, когда вы сомневаетесь, переходите к определенному источнику для таких вещей определения.