2

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

4

2 回答 2

3

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

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

输出:

exit status: 3

文档中:

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

于 2013-08-05T18:43:50.277 回答
1

一种集中退出消息的方法:

module Kernel
  alias :real_exit :exit

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

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

于 2013-08-05T18:43:21.703 回答