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


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.