kind=defined
names=fail,raise
visibility=public

--- raise -> ()
--- fail  -> ()
--- raise(message) -> ()
--- fail(message)  -> ()
--- raise(error_type, message = nil, backtrace = caller(0)) -> ()
--- fail(error_type, message = nil, backtrace = caller(0))  -> ()

例外を発生させます。
発生した例外は変数 [[m:$!]] に格納されます。また例外が
発生した時のスタックトレースは変数 [[m:$@]] に格納され
ます。発生した例外は rescue 節で捕捉できます。

引数無しの場合は、同スレッドの同じブロック内で最後に rescue された
例外オブジェクト ([[m:$!]]) を再発生させます。そのような
例外が存在しないが自身は捕捉されている時には例外 [[c: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 を渡すことができます。

@param error_type 発生させる例外を例外クラスまたは例外クラスのインスタンスで指定します。
@param message 例外のメッセージとなる文字列です。
@param backtrace 例外発生時のスタックトレースで、[[m:Kernel.#caller]] の戻り値と同じ
  形式で指定しなければいけません。
@raise TypeError exception メソッドが例外オブジェクトを返さなかった場合に発生します。

例外の捕捉の例を示します。

  #例1
  begin
    raise NameError,"!!error!!"
  rescue ArgumentError => rer
  rescue NameError => rer
  rescue TypeError => rer
  ensure
    p rer #=> #<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
  
  raise MyException.new rescue p $! #=> #<SecurityError: SecurityError>

@see [[m:Kernel.#caller]]

