例外: raise 関数と reraise 関数

  • raise 関数は、エラーまたは例外条件が発生したことを示すために使用されます。 エラーに関する情報は、例外オブジェクトでキャプチャされます。
  • reraise 関数は、処理された例外を呼び出しチェーンに伝達する目的で使用されます。

構文

raise (expression)

解説

raise 関数は、例外オブジェクトを生成し、スタックのアンワインド プロセスを開始します。 スタックのアンワインド プロセスは共通言語ランタイム (CLR) によって管理されているため、このプロセスの動作は他のすべての .NET 言語と同じになります。 スタックのアンワインド プロセスでは、生成された例外に一致する例外ハンドラーを検索します。 検索は、現在の try...with 式 (存在する場合) で開始されます。 with ブロック内の各パターンが順番に確認されます。 一致する例外ハンドラーが見つかった場合、例外は処理済みと見なされます。それ以外の場合、スタックはアンワインドされ、一致するハンドラーが見つかるまで呼び出しチェーンの上部にある with ブロックが確認されます。 呼び出しチェーンで見つかった finally ブロックも、スタックのアンワインドと同様に順番に実行されます。

raise 関数は、C# または C++ の throw に相当します。

次のコード例は、raise 関数を使用して例外を生成する方法を示しています。

exception InnerError of string
exception OuterError of string

let function1 x y =
   try
     try
        if x = y then raise (InnerError("inner"))
        else raise (OuterError("outer"))
     with
      | InnerError(str) -> printfn "Error1 %s" str
   finally
      printfn "Always print this."


let function2 x y =
  try
     function1 x y
  with
     | OuterError(str) -> printfn "Error2 %s" str

function2 100 100
function2 100 10

raise 関数は、次の例に示すように、.NET の例外を発生させるためにも使用できます。

let divide x y =
  if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
  else
     x / y

例外の上げ直し

reraise 関数は、処理された例外を呼び出しチェーンに伝達する目的で with ブロック内で使用されます。 reraise は例外オペランドを使用しません。 これは、メソッドが呼び出し元から他のライブラリ メソッドに引数を渡し、そのライブラリ メソッドが、呼び出し元に渡す必要がある例外を発生させるときに最も役立ちます。

reraise 関数は、計算されたリスト、配列、シーケンス、計算式 (task { .. }async { .. } など) で、try/with 構造体の with ブロックでは使用できないことがあります。

open System

let getFirstCharacter(value: string) =
    try
        value[0]
    with :? IndexOutOfRangeException as e ->
        reraise()

let s = getFirstCharacter("")
Console.WriteLine($"The first character is {s}")

// The example displays the following output:
//   System.IndexOutOfRangeException: Index was outside the bounds of the array.
//      at System.String.get_Chars(Int32 index)
//      at getFirstCharacter(String value)
//      at <StartupCode>.main@()

関連項目