2013-08-05 81 views
2

Ruby具有BEGIN {}END {}块,以确保它们分别在代码的主要部分之前和之后运行。在END中访问Ruby退出代码

我有以下代码:

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#{[email protected]}" 
} 

输出:

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

编辑#2 :在我退出之前,我必须定义我的END区块。由于@Stefan

回答

3

Kernel#exit提出了一个SystemExit例外,因为全局变量$!包含当前异常,你就可以用$!.status退出状态:

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

输出:

exit status: 3 

documentation

当一个异常被提出,但尚未处理(在rescueensureat_exitEND块)的全局变量$!将包含 当前异常和[email protected]包含当前异常的 回溯。

+0

这真是太棒了,我一定会记住我的周末项目,但我在工作时使用CentOS,并坚持使用1.8.7。我将编辑该问题。谢谢! –

+0

@DevonFinninger为我工作1.8.7 – Stefan

+0

看我的编辑,看看我做了什么。我搞砸了实施? –

1

一个方法来集中退出消息:

module Kernel 
    alias :real_exit :exit 

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

的方法就是在Kernel#exit method的周围别名。请注意,一旦您定义了此覆盖,所有其他退出呼叫将通过您的覆盖。

+0

是的,我想到了这种实现。这并不理想,但可能是必要的。谢谢一堆! –