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
答案 0 :(得分:3)
Kernel#exit
引发SystemExit
例外,由于全局变量$!
包含当前例外,您可以通过$!.status
获取退出状态:
END {
puts "exit status: #{$!.status}"
}
exit 3
输出:
exit status: 3
当引发异常但尚未处理时(在
rescue
中, 全局变量ensure
将包含at_exit
,END
和$!
块) 当前异常和$@
包含当前异常 回溯。
答案 1 :(得分:1)
集中退出邮件的方法:
module Kernel
alias :real_exit :exit
def exit status
puts "Hello World"
real_exit status
end
end
该方法只是Kernel#exit method上的别名。请注意,一旦您定义了此覆盖,所有其他退出调用都将通过您的覆盖。