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