- ベストアンサー
rubyのevalのエラーを検知したい
rubyでevalを実行した時、その文が、構文的に正しくない場合、実行時にエラーになりますが、これを、検知する方法はあるでしょうか。 begin eval("実行対象の文(構文エラーの可能性有り)") resucue ここが実行されることを期待したが、ここに制御が移りませんでした。 end
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ああ、すみません。質問文に構文的に正しくない場合ってありますね。 SyntaxErrorはクラスを指定しないrescueではできません。 Rubyリファレンスマニュアル - 制御構造 http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%C0%A9%B8%E6%B9%BD%C2%A4 Rubyリファレンスマニュアル - 組み込みクラス/モジュール/例外クラス http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%C1%C8%A4%DF%B9%FE%A4%DF%A5%AF%A5%E9%A5%B9%A1%BF%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%A1%BF%CE%E3%B3%B0%A5%AF%A5%E9%A5%B9#a.ce.e3.b3.b0.a5.af.a5.e9.a5.b9 irb(main):001:0> begin irb(main):002:1* eval("a=(1/0") irb(main):003:1> rescue SyntaxError irb(main):004:1> puts "構文エラーがありました" irb(main):005:1> end 構文エラーがありました => nil ということで適切なクラスを指定して捕捉してください。
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
> resucue スペルミスしてます。 irb(main):001:0> begin irb(main):002:1* eval("1/0") irb(main):003:1> resucue irb(main):004:1> puts "error" irb(main):005:1> end ZeroDivisionError: (eval):1:in `irb_binding': divided by 0 from (irb):2:in `eval' from (irb):2:in `eval' from (irb):2 from c:/ruby/lib/ruby/1.9/irb.rb:150:in `block (2 levels) in eval_input' from c:/ruby/lib/ruby/1.9/irb.rb:259:in `signal_status' from c:/ruby/lib/ruby/1.9/irb.rb:147:in `block in eval_input' from c:/ruby/lib/ruby/1.9/irb.rb:146:in `eval_input' from c:/ruby/lib/ruby/1.9/irb.rb:70:in `block in start' from c:/ruby/lib/ruby/1.9/irb.rb:69:in `catch' from c:/ruby/lib/ruby/1.9/irb.rb:69:in `start' from c:/ruby/bin/irb.bat:21:in `<main>' irb(main):006:0> begin irb(main):007:1* eval("1/0") irb(main):008:1> rescue irb(main):009:1> puts "error" irb(main):010:1> end error => nil irb(main):011:0>
お礼
>> resucue >スペルミスしてます。 失礼しました。 rescue に正しく修正して確認しました。 検知したいのは、 eval("1/0")ではなく str = "a=(1/0" eval(str) としたときに、これをシンタックスエラーとして検知したいために rescue のところを実行させたいということです。 上記のstrは "(" があるためシンタックスエラーとなります。 このケースでrescue以下の部分を実行させる方法があるかというのが 質問の趣旨です。 上記を実行すると、 rescueが実行されずに、 以下のエラーメッセージが標準エラーに出力されてしまいます。 (eval):1: syntax error a=(1/0
お礼
rescue SyntaxError を指定して、望んだ結果を得ることが出来ました。 ありがとうございました。