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


88

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

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

8
В дополнение к приведенным ниже ответам стоит знать, что люди используют raiseпри обработке исключений, а failкогда нет.
Бала,

6
Это не ключевое слово, это метод.
Jörg W Mittag

Документация: Kernel # fail
Джаред Бек

Также обратите внимание, что вы можете записать их в виде однострочных операторов: fail "Password too short" if password.length < 8иfail "No user name set" unless username
PhilT

Ответы:


136

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

У failметода есть три перегрузки:

  • fail: вызывает RuntimeErrorбез сообщения об ошибке.

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

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

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

    fail ArgumentError, "Illegal String"
    

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

    fail ArgumentError, "Illegal String", caller
    

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

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

Источник: Документация Ruby по модулю ядра .


2
Можете ли вы привести 3 простых примера с 3 пунктами списка? Это сделает ваш ответ более конкретным .. :)
Аруп Ракшит

1
Вау, +1, crazybob лучше, чем Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Борис Ститницкий

Это сработало для меня, но Rubocop преобразовал его вraise
Павел

32

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

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

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

Вот пример.

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

+1 за рекомендации по стилю; даже если они семантически идентичны, использование каждого из них в предполагаемой настройке помогает лучше передать намерение
fatuhoku

26

fail == raise

Другими словами, failэто просто популярный псевдоним raiseметода повышения ошибок. Применение:

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

7

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


2
Woot, это действительно НЕУДАЧА. Пример кода для
ошибки

4
@VajkHermecz fail - это псевдоним повышения, поэтому он повторно использует документацию. Сравните с документацией для Array # map и Array # collect
Джейми Мейси,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.