|   | |||||
| 対象: 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) 
 Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved. [Home] | |||||