Как создать сообщение о выходе

208

Существует ли однострочный вызов функции, который завершает работу программы и отображает сообщение? Я знаю, в Perl это так просто, как:

die("Message goes here")

Я устал набирать это:

puts "Message goes here"
exit
Крис Банч
источник
10
Небольшой комментарий, ваши putsзаписи на стандартный вывод, а dieзаписи на стандартный вывод, так: $stderr.puts "Message goes here".
cdarke
Я знаю, что это не был ответ, но он ответил на мой вопрос, спасибо
Патрик
Просто для справки, в Python это так sys.exit("Message goes to stderr").
анатолий техтоник

Ответы:

361

abortФункция делает это. Например:

abort("Message goes here")

Примечание: abortсообщение будет записано STDERRвместо того, в putsкоторое будет записано STDOUT.

Крис Банч
источник
6
Вот Это Да! Хорошая находка! Жаль, что они не просто перегружали выход этой функцией ...
Майк Стоун,
56
Обратите внимание: отмена выхода из программы со статусом false, что означает сбой. выход по умолчанию завершается со статусом true, представляющим успех. Убедитесь, что вы используете правильный для ситуации.
Алекс Сперлинг
1
число рейнольдса Комментарий Майка Стоуна, иногда кажется, что Ruby написана группой людей, которые не общались друг с другом, не так ли? (Тем не менее, в нем так легко программировать.)
JellicleCat
24

Если вы хотите обозначить фактическую ошибку в вашем коде, вы можете вызвать RuntimeErrorисключение:

raise RuntimeError, 'Message goes here'

Это напечатает трассировку стека, тип возбуждаемого исключения и сообщение, которое вы предоставили. В зависимости от ваших пользователей, трассировка стека может быть слишком страшной, и реальное сообщение может потеряться в шуме. С другой стороны, если вы умрете из-за реальной ошибки, трассировка стека даст вам дополнительную информацию для отладки.

Йорг Миттаг
источник
24
Вам не нужно упоминать RuntimeError, чтобы поднять единицу (это тип исключения по умолчанию), поэтому будет достаточно следующего кода: поднять «Message here here»
sunaku
sunaku - хотя ваш комментарий совершенно действителен, я часто обнаруживал, что более явное замечание может быть полезно, особенно для других людей, читающих код позже.
Шеви
2

Я никогда не слышал о такой функции, но ее было бы достаточно просто реализовать ...

def die(msg)
  puts msg
  exit
end

Затем, если это определено в каком-то файле .rb, который вы включаете во все свои сценарии, вы - золотой… просто потому, что он не встроен, не означает, что вы не можете сделать это сами ;-)

Майк Стоун
источник
3
Оказывается, функция 'abort' делает это (см. Мой ответ ниже)
Крис Банч
1
Зачем писать код, если функция прерывания делает это за вас?
Гэри Харан
2
@ChrisBunch Это не то же самое, что функция отмены : по exitумолчанию возвращается, как если бы это было успешно. abortвозвращает сбой. exit 1также вернет ошибку.
TemporalWolf
2

Я попал сюда в поисках способа выполнить некоторый код всякий раз, когда программа заканчивается.
Нашел это :

Kernel.at_exit { puts "sayonara" }
# do whatever
# [...]
# call #exit or #abort or just let the program end
# calling #exit! will skip the call

Вызывается несколько раз, чтобы зарегистрировать несколько обработчиков.

Giuse
источник