在Ruby开发Ruby控制台应用的时候,遇到一个问题: 用户可以通过Ctrl+C来中止运行时的程序。
如果不加控制,则程序会被中止,并打印出错误堆栈。
比如下面的程序:
cmd
=
nil
while cmd !~ / Y | y | N | n /
print " continue?(Y/N): "
cmd = STDIN . gets
cmd . chomp !
end
if cmd =~ / Y | y / then
puts " continue. "
else
puts " exit. "
end
while cmd !~ / Y | y | N | n /
print " continue?(Y/N): "
cmd = STDIN . gets
cmd . chomp !
end
if cmd =~ / Y | y / then
puts " continue. "
else
puts " exit. "
end
运行时,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来捕获该异常。
begin
cmd = nil
while cmd !~ / Y | y | N | n /
print " continue?(Y/N): "
cmd = STDIN . gets
cmd . chomp !
end
if cmd =~ / Y | y / then
puts " continue. "
else
puts " exit. "
end
rescue Interrupt
puts " Programme is interrupted. "
end
cmd = nil
while cmd !~ / Y | y | N | n /
print " continue?(Y/N): "
cmd = STDIN . gets
cmd . chomp !
end
if cmd =~ / Y | y / then
puts " continue. "
else
puts " exit. "
end
rescue Interrupt
puts " Programme is interrupted. "
end
运行时,Ctrl+C中断,则屏幕上出现:
continue?(Y/N):Programme is interrupted.
从而避免堆栈信息给用户带来的迷惑。
ps: Kernal::exit 命令则会抛出 SystemExit 异常。