Що робить ключове слово 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


Також зверніть увагу, ви можете написати це як однорядкові висловлювання: 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а не a RuntimeError:

    fail ArgumentError, "Illegal String"
    

    Інший приклад: Ви можете передати всю трасування до failметоду , так що ви можете отримати доступ до сліду всередині rescueблоку:

    fail ArgumentError, "Illegal String", caller
    

    caller- це метод ядра, який повертає зворотну траєкторію як масив рядків у формі file:line: in 'method'.

Без аргументів викликає виняток у $! або викликає RuntimeError, якщо $! дорівнює нулю. За допомогою одного аргументу String піднімає RuntimeError із рядком як повідомлення. В іншому випадку першим параметром має бути ім'я класу винятків (або об'єкта, який повертає об'єкт винятку, коли надсилається повідомлення про виняток). Необов’язковий другий параметр встановлює повідомлення, пов’язане з винятком, а третій параметр - це масив інформації про зворотний виклик. Винятки охоплює пункт порятунку блоків begin ... end.

Джерело: Документація Ruby про модуль ядра .


2
Чи можете ви навести 3 простих приклади з 3 маркерами? Це зробить вашу відповідь більш конкретною .. :)
Arup Rakshit

1
Ого, +1, божевільний кращий за документи Ruby ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Борис Стітніцький

Він працював для мене , але Rubocop перетворили його вraise
PAUL

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
Вут, це справді ФАЙЛ. Прикладом коду для помилки є скопіювати-вставити з рейзу o_O
Вайк Гермеч

4
@VajkHermecz fail - це псевдонім підвищення, тому він повторно використовує документацію. Порівняйте з документами для Array # map і Array # collect
Jamie Macey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.