対象:
CRuby
JRuby

evalのSyntaxErrorがrescue節で捕捉できない

evalは例外スローしそうだからbegin endで囲っておいたのにSyntaxErrorで異常終了してしまったことはないだろうか。きっとそれはrescue節でerror_typeを指定しなかったからだ。rescue節でerror_typeを指定しないとStandardErrorを指定したものとみなされる。

[mobile@localhost ruby]$ jruby eval_exception.rb
SyntaxError: (eval):1: unterminated string meets end of file3 */ 3
     ^
    eval at org/jruby/RubyKernel.java:1083
  (root) at eval_exception.rb:2

一方、evalで文字列をパースしたときの例外SyntaxErrorはStandardErrorのサブクラスではない。それ故、SyntaxErrorがスローされたとき、rescue節で捕捉されずに異常終了してしまったのだ。従って、SyntaxErrorをrescue節で捕捉するにはerror_typeでExceptionを指定するだけで良い。

begin
  eval("3 */ 3")
rescue Exception
  print "Caught! Exception\n"
end
(2013/11/19)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved.
[Home]