web-dev-qa-db-ja.com

Rubyでは、 `rescue`ステートメントをネストできる構造は何ですか

Rubyでエラーをキャッチするには、rescueステートメントを使用します。通常、このステートメントはbeginendの間に発生します。ブロックの一部としてのrescueステートメント(do ... end)またはメソッド(def ... end)。私の質問は、他にどのような構造(ループ、while、if、...)があれば、その中に巣を救うのでしょうか?

33
John F. Miller

レスキューを使用できるのは、次の2つの場合のみです。

  • 以内 begin ... endブロック

    begin
      raise
    rescue 
      nil
    end
    
  • ステートメント修飾子として

    i = raise rescue nil
    

関数、モジュール、およびクラス本体(Jörgに感謝)は暗黙的ですbegin...endブロックなので、明示的なbegin/endなしで任意の関数内でレスキューできます。

    def foo
      raise
    rescue
      nil
    end

ブロック形式は、オプションのパラメーターのリストを取り、rescueに対する例外(および子孫)を指定します。

    begin
      eval string
    rescue SyntaxError, NameError => boom
      print "String doesn't compile: " + boom
    rescue StandardError => bang
      print "Error running script: " + bang
    end

ステートメント修飾子としてインラインで呼び出された場合、またはbegin/endブロック内で引数なしで呼び出された場合、rescueは StandardErrorとその子孫 をキャッチします。

これが rescue に関する1.9のドキュメントです。

44
klochner