raise -> ()
[permalink][rdoc]fail -> ()
raise(message, cause: $!) -> ()
fail(message, cause: $!) -> ()
raise(error_type, message = nil, backtrace = caller(0), cause: $!) -> ()
fail(error_type, message = nil, backtrace = caller(0), cause: $!) -> ()
例外を発生させます。発生した例外は変数 $! に格納されます。また例外が発生した時のスタックトレースは変数 $@ に格納されます。発生した例外は rescue 節で捕捉できます。
引数無しの場合は、同スレッドの同じブロック内で最後に rescue された例外オブジェクト ($!) を再発生させます。そのような例外が存在しないが自身は捕捉されている時には例外 RuntimeError を発生させます。
begin open("nonexist") rescue raise #=> `open': No such file or directory - "nonexist" (Errno::ENOENT) end
引数を渡した場合は、例外メッセージ message を持った error_type の示す例外(省略時 RuntimeError)を発生させます。
error_type として例外ではないクラスやオブジェクトを指定した場合、そのオブジェクトの exception メソッドが返す値を発生する例外にします。その際、exception メソッドに引数として変数 message を渡すことができます。
例外の捕捉の例を示します。
#例1 begin raise NameError,"!!error!!" rescue ArgumentError => err rescue NameError => err rescue TypeError => err ensure p err #=> #<NameError: !!error!!> end #例2 def foo num print 'in method.' raise "error!!" if num <= 9 rescue RuntimeError num += 10 print 'in rescue.' retry else print 'in else.' ensure print "in ensure.\n" end foo(4) #=> in method.in rescue.in method.in else.in ensure. #例3 class MyException def exception(mesg=nil) SecurityError.new(mesg) end end begin raise MyException.new rescue SecurityError p $! #=> #<SecurityError: SecurityError> end
[SEE_ALSO] Kernel.#caller