Как прервать скрипт Ruby при возникновении исключения?

Возможно ли в Ruby вызвать исключение, которое также автоматически прервет программу, игнорируя любые вложенные блоки начала/спасения?


person user2398029    schedule 03.03.2012    source источник
comment
Если вы хотите прервать программу, почему бы не пойти прямо и не использовать «выход»?   -  person Edu    schedule 04.03.2012
comment
Хотя это правда, это все равно будет поймано исключением SystemExit: gist.github.com/fa5ce273ba27823d0003   -  person Lee Jarvis    schedule 04.03.2012


Ответы (4)


К сожалению, ни один из этих exit ответов не сработает. exit делает рейз SystemExit, который можно поймать. Наблюдать:

begin
  exit
rescue SystemExit
end

puts "Still here!"

Как говорит @dominikh, вместо этого вам нужно использовать exit!:

begin
  exit!
rescue SystemExit
end

puts "Didn't make it here :("
person Lee Jarvis    schedule 04.03.2012
comment
Хотя это и не имеет прямого отношения к этому вопросу, читатели должны отметить, что exit! также имеет побочный эффект отсутствия обработки блоков at_exit или END, что может привести к некоторым царапинам в голове в определенных ситуациях :-) - person Peter Cooper; 04.03.2012

Эду уже спрашивал: Если вы хотите прервать программу, почему бы не перейти прямо к ней и не использовать «выход»

Одна возможность: вы можете определить свое собственное исключение, и когда исключение вызывается, исключение останавливает программу с выходом:

class MyException < StandardError
  #If this Exception is created, leave programm.
  def initialize
    exit 99
  end
end


begin
  raise MyException
rescue MyException
  puts "You will never see meeeeeee!"
end
puts "I will never get called neither :("
person knut    schedule 03.03.2012

Будет ли это делать то, что вы хотите?

begin
  puts Idontexist
rescue StandardError
  exit
  puts "You will never see meeeeeee!"
end
puts "I will never get called neither :("
person Maran    schedule 03.03.2012

Мой ответ похож на ответ Марана, но немного отличается:

begin
  puts 'Hello'
  # here, instead of raising an Exception, just exit.
  exit
  puts "You will never see meeeeeee!"
rescue # whatever Exception
  # ...
end

puts "I will never get called neither :("
person Sony Santos    schedule 03.03.2012