2013-02-03 63 views
2

我試圖處理在Ruby中加載無效YAML數據,但似乎無法營救被迷幻引發的異常。無法施救YAML.load例外

這是一些示例代碼,以證明我遇到的問題:

require 'yaml' 
begin 
    YAML.load('&*%^*') 
rescue 
    puts "Rescued" 
end 

和異常:

# 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>' 
+0

在一個側面說明,我建議你不要使用'YAML.load'與任何​​用戶預期的數據,鑑於最近的所有軌道YAML和JSON相關的漏洞,允許惡意用戶執行遠程執行漏洞。 –

+0

您是否爲此問題獲得任何解決方案?除了捕捉異常。 – shajin

+0

@shajin我在接受的解決方案中,'rescue SyntaxError'中做了什麼,而不是所有的'Exception'。不是最好的,但比拯救一切更好。 – Patrick

回答

5

Begin Rescue not catching error。可以挽救語法錯誤,但不推薦。這就是爲什麼你需要跳過輸入「rescue SyntaxError」的額外箍。

+0

啊,我的谷歌福失敗了我:-(。謝謝,這說明它比較好。 – Patrick

6

繼承了SyntaxError是:

SyntaxError < ScriptError < Exception 

rescue不帶參數只抓住StandardError這是Exception一個子類:

StandardError < Exception 

所以,如果你想從Yaml.load趕上語法錯誤,您必須使用rescue SyntaxError => e或使用rescue Exception => e捕獲所有錯誤。

+1

而且['精極度緊張:: SyntaxError'是':: SyntaxError'一個子類(https://github.com/tenderlove/迷幻/ BLOB/V1.3.4/lib中/迷幻/ syntax_error.rb#L2),這就是爲什麼這適用於這種情況。(雖然繼承':: SyntaxError'似乎是一個奇怪的決定)。 – matt