-
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@()
こちらも参照ください
.NET