重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

rubyでevalを実行した時、その文が、構文的に正しくない場合、実行時にエラーになりますが、これを、検知する方法はあるでしょうか。
begin
eval("実行対象の文(構文エラーの可能性有り)")
resucue
ここが実行されることを期待したが、ここに制御が移りませんでした。
end

A 回答 (2件)

ああ、すみません。

質問文に構文的に正しくない場合ってありますね。

SyntaxErrorはクラスを指定しないrescueではできません。

Rubyリファレンスマニュアル - 制御構造
http://www.ruby-lang.org/ja/man/index.cgi?cmd=vi …
Rubyリファレンスマニュアル - 組み込みクラス/モジュール/例外クラス
http://www.ruby-lang.org/ja/man/index.cgi?cmd=vi …

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

ということで適切なクラスを指定して捕捉してください。
    • good
    • 0
この回答へのお礼

rescue SyntaxError
を指定して、望んだ結果を得ることが出来ました。
ありがとうございました。

お礼日時:2007/11/26 15:12

> 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>
    • good
    • 0
この回答へのお礼

>> resucue
>スペルミスしてます。
失礼しました。
rescue に正しく修正して確認しました。
検知したいのは、 eval("1/0")ではなく
str = "a=(1/0"
eval(str)
としたときに、これをシンタックスエラーとして検知したいために
rescue のところを実行させたいということです。
上記のstrは "(" があるためシンタックスエラーとなります。
このケースでrescue以下の部分を実行させる方法があるかというのが
質問の趣旨です。

上記を実行すると、
rescueが実行されずに、
以下のエラーメッセージが標準エラーに出力されてしまいます。
(eval):1: syntax error
a=(1/0

お礼日時:2007/11/26 14:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!