対象:
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)

新着情報
【iOS Objective-C, Swift Tips】アプリアイコンにバッジを表示(Swift)
【iOS Objective-C, Swift Tips】画像の向きを指定して保存する(Swift)
【iOS Objective-C, Swift Tips】UIImagePickerControllerの表示を日本語にする(Swift)

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