2015-11-03 86 views
0

我发现自己需要执行一个字符串。目前的方法是使用Kernel#eval()方法。一切工作正常,但我的错误处理不起作用。例如,一个缺失的结束引号将完全杀死并退出程序。Ruby Kernel方法不能正常工作的错误处理

这是一段摘录。任何想法,为什么我不能抓住错误?

def process(str) 
    print "\n" 
    eval(str) 
rescue => e 
    puts e 
end 

>> process('"') 
console.rb:90:in `eval': (eval):1: unterminated string meets end of file (SyntaxError) 
     from console.rb:90:in `process' 
     from console.rb:81:in `bouncer' 
     from console.rb:14:in `block in prompt' 
     from console.rb:11:in `loop' 
     from console.rb:11:in `prompt' 
     from console.rb:97:in `<main>' 

回答

1

按照documentation

没有明确的异常类将拯救所有StandardErrors(只有那些)一个救援条款。

SyntaxError不是StandardError。要抓住它,你必须是明确的,例如:

def process(str) 
    print "\n" 
    eval(str) 
rescue Exception => e 
    puts e 
end 

process('"') 

输出:

(eval):1: unterminated string meets end of file 
+0

工作就像一个魅力。我不知道一个“拯救”条款只捕获一个“StandardError”。谢谢! – binarymason

+0

@ m8ss它捕获“所有标准错误”,即“StandardError”及其子类。 ['Exception'](http://ruby-doc.org/core-2.2.3/Exception.html)的文档包含一个类层次结构。 – Stefan

+0

没错。下次我遇到这个问题时,我会记住错误的_class_。再次感谢。 – binarymason