无法解救YAML.load异常

Pat*_*ick 2 ruby yaml exception-handling exception

我正在尝试处理在Ruby中加载无效的YAML数据,但似乎无法挽救心理引发的异常.

这是一些示例代码,用于演示我遇到的问题:

require 'yaml'
begin
    YAML.load('&*%^*')
rescue
    puts "Rescued"
end
Run Code Online (Sandbox Code Playgroud)

例外情况:

# ruby test.rb
/usr/lib64/ruby/1.9.1/psych.rb:203:in `parse': (<unknown>): did not find expected alphabetic or numeric character while scanning an anchor at line 1 column 1 (Psych::SyntaxError)
    from /usr/lib64/ruby/1.9.1/psych.rb:203:in `parse_stream'
    from /usr/lib64/ruby/1.9.1/psych.rb:151:in `parse'
    from /usr/lib64/ruby/1.9.1/psych.rb:127:in `load'
    from test.rb:3:in `<main>'
Run Code Online (Sandbox Code Playgroud)

Leo*_*rea 7

继承SyntaxError是:

SyntaxError < ScriptError < Exception
Run Code Online (Sandbox Code Playgroud)

rescue没有参数只捕获StandardError哪个是以下的子类Exception:

StandardError < Exception
Run Code Online (Sandbox Code Playgroud)

因此,如果要捕获语法错误Yaml.load,则必须rescue SyntaxError => e或使用捕获所有错误rescue Exception => e.

  • 另外[`Psych :: SyntaxError`是`:: SyntaxError`的子类](https://github.com/tenderlove/psych/blob/v1.3.4/lib/psych/syntax_error.rb#L2)这就是为什么这适用于这种情况.(虽然继承`:: SyntaxError`似乎确实是一个奇怪的决定). (2认同)

Rec*_*eck 5

请参阅开始救援未捕获错误.可以挽救语法错误,但不推荐.这就是为什么你需要跳过输入" rescue SyntaxError" 的额外箍.