Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library _builtin > module Kernel > fail

module function Kernel.#fail

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

例外を発生させます。 発生した例外は変数 $! に格納されます。また例外が 発生した時のスタックトレースは変数 $@ に格納され ます。発生した例外は 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 を渡すことができます。

[PARAM] error_type:
発生させる例外を例外クラスまたは例外クラスのインスタンスで指定します。
[PARAM] message:
例外のメッセージとなる文字列です。
[PARAM] backtrace:
例外発生時のスタックトレースで、Kernel.#caller の戻り値と同じ 形式で指定しなければいけません。
[EXCEPTION] 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_ALSO] Kernel.#caller