访问END {}中的Ruby退出代码

时间:2013-08-05 18:10:21

标签: ruby

Ruby拥有BEGIN {}END {}块,可以保证它们分别在代码的主要部分之前和之后运行。

我有以下代码:

BEGIN {
  $my_args = ARGV.dup
  ARGV.clear
} # clean up 'gets'

# For the truly paranoid in all of us
def self.run_away?
  print "You're paranoid. Exit? (Y/n) "
  ans = gets.chomp.downcase
  if ["no", "n"].include?(ans)
    puts "Alright, your call. Let's keep going."
  else
    puts "EXITING"
    log("Exiting at paranoid users request.")
    exit 3
  end
end

END {  } # do stuff here

我在我的脚本中定义了一些错误代码。 我希望能够读取错误代码并根据该代码打印简短描述。例如。 - EXITING - 3: Exit at user request,而不是每次在代码中使用exit时都编写描述性字符串。有没有办法在END {}块中执行此操作?或者其他我想念的东西?

编辑/注意:我坚持使用Ruby 1.8.7 ,以下内容不起作用:(见下文)

BEGIN { puts "BEGIN block!" }

puts "Main block!"
exit 3

END {
  puts "END block!"
  puts "Current Exception: \n#{$!}"
  puts "Current Backtrace: \n#{$@}"
}

输出:

~: $ ./test.rb 
BEGIN block!
Main block!
~: $ echo $?
3
~: $

编辑#2:我必须在退出之前定义END块。感谢@Stefan

2 个答案:

答案 0 :(得分:3)

Kernel#exit引发SystemExit例外,由于全局变量$!包含当前例外,您可以通过$!.status获取退出状态:

END {
  puts "exit status: #{$!.status}"
}
exit 3

输出:

exit status: 3

来自documentation

  

当引发异常但尚未处理时(在rescue中,   全局变量ensure将包含at_exitEND$!块)   当前异常和$@包含当前异常   回溯。

答案 1 :(得分:1)

集中退出邮件的方法:

module Kernel
  alias :real_exit :exit

  def exit status
    puts "Hello World"
    real_exit status
  end
end

该方法只是Kernel#exit method上的别名。请注意,一旦您定义了此覆盖,所有其他退出调用都将通过您的覆盖。