Ruby控制台应用中的Ctrl+C

时间:2021-06-09 20:43:18

在Ruby开发Ruby控制台应用的时候,遇到一个问题: 用户可以通过Ctrl+C来中止运行时的程序。

如果不加控制,则程序会被中止,并打印出错误堆栈。

比如下面的程序:

Ruby控制台应用中的Ctrl+Ccmd  =  nil
Ruby控制台应用中的Ctrl+C
while  cmd  !~   / Y | y | N | n /
Ruby控制台应用中的Ctrl+C  
print   " continue?(Y/N): "
Ruby控制台应用中的Ctrl+C  cmd 
=  STDIN . gets
Ruby控制台应用中的Ctrl+C  cmd
. chomp !
Ruby控制台应用中的Ctrl+Cend
Ruby控制台应用中的Ctrl+C
if  cmd  =~   / Y | y /  then
Ruby控制台应用中的Ctrl+C  puts 
" continue. "
Ruby控制台应用中的Ctrl+C
else
Ruby控制台应用中的Ctrl+C  puts 
" exit. "
Ruby控制台应用中的Ctrl+Cend

运行时,Ctrl+C中断,则屏幕上出现:

continue?(Y/N):E:/ProjectRuby/03_プロジェクト開発/06_Source/TestRu
nner/tester.rb:48:in `gets': Interrupt
        from E:/ProjectRuby/03_プロジェクト開発/06_Source/TestRunn
er/tester.rb:48

为了防止中断信息带给用户糟糕的提示信息,程序中应该对该情况加以处理,

用户的Ctrl+C会在Ruby底层抛出一个 Interrupt 异常,因此你可以通过begin...rescue...end来捕获该异常。

Ruby控制台应用中的Ctrl+Cbegin
Ruby控制台应用中的Ctrl+C  cmd 
=  nil
Ruby控制台应用中的Ctrl+C  
while  cmd  !~   / Y | y | N | n /
Ruby控制台应用中的Ctrl+C    
print   " continue?(Y/N): "
Ruby控制台应用中的Ctrl+C    cmd 
=  STDIN . gets
Ruby控制台应用中的Ctrl+C    cmd
. chomp !
Ruby控制台应用中的Ctrl+C  end
Ruby控制台应用中的Ctrl+C  
if  cmd  =~   / Y | y /  then
Ruby控制台应用中的Ctrl+C    puts 
" continue. "
Ruby控制台应用中的Ctrl+C  
else
Ruby控制台应用中的Ctrl+C    puts 
" exit. "
Ruby控制台应用中的Ctrl+C  end
Ruby控制台应用中的Ctrl+Crescue Interrupt
Ruby控制台应用中的Ctrl+C  puts 
" Programme is interrupted. "
Ruby控制台应用中的Ctrl+Cend

运行时,Ctrl+C中断,则屏幕上出现:

continue?(Y/N):Programme is interrupted.

从而避免堆栈信息给用户带来的迷惑。

ps:  Kernal::exit  命令则会抛出 SystemExit 异常。