40

eval()Ruby 1.8.6 でコードを実行するときに発生する構文エラーを解決する方法を見つけようとしています。

次の Ruby コードが必要です。

#!/usr/bin/ruby

good_str = "(1+1)"
bad_str = "(1+1"    # syntax error: missing closing paren

begin
    puts eval(good_str)
    puts eval(bad_str)
rescue => exc
    puts "RESCUED!"
end

実行すると次の結果が生成されます。

2
RESCUED!

代わりに、私が得るものは次のとおりです。

2
eval_rescue.rb:8: (eval):1: compile error (SyntaxError)
(eval):1: syntax error, unexpected $end, expecting ')'

eval メソッドによって発生した SyntaxError は、自分で処理する機会を与えずに、eval 内のどこかでレスキューされているようです。

私が望む動作を取得する方法を知っている人はいますか (つまり、「レスキュー」句が「評価」からエラーをキャッチするため)?

4

2 に答える 2

50

ブレントはすでに有効な回答を得ていますが、回避できる最小限の例外セットから救うことをお勧めします. これにより、意図しないものを誤って飲み込んでしまうことがなくなります。

したがって、

begin
  puts eval(good_str)
  puts eval(bad_str)
rescue SyntaxError => se
  puts 'RESCUED!'
end
于 2009-02-12T19:47:03.977 に答える
45

なるほど、簡単だった…

デフォルトでは、"rescue" ステートメントはすべての例外をキャッチするのではなく、StandardError のサブクラスである例外のみをキャッチすることがわかります。SyntaxError は StandardError の兄弟/いとこであり、そのサブクラスではないため、明示的に指示されない限り、レスキュー ステートメントはそれをキャプチャしません。

レスキュー ブロックですべての例外をキャプチャするには、コードを次のように変更する必要があります。

#!/usr/bin/ruby

good_str = "(1+1)"
bad_str = "(1+1"    # syntax error: missing closing paren

begin
    puts eval(good_str)
    puts eval(bad_str)
rescue Exception => exc
    puts "RESCUED!"
end

"rescue => exc" から "rescue Exception => exc" への "rescue" 行の変更に注意してください。

ここで、コードを実行すると、目的の結果が得られます。

2
RESCUED!
于 2009-02-12T19:25:42.513 に答える