次の方法で共有


例外: try...with 式 (F#)

このトピックでは、try...with 式について説明します。これは、F# 言語で例外を処理するために使用する式です。

try
 expression1
with
  | pattern1 -> expression2
  | pattern2 -> expression3
  ...

解説

try...with 式は、F# で例外を処理するために使用します。C# の try...catch ステートメントと似ています。前の構文では、expression1 内のコードが例外を生成する可能性があります。try...with 式は、値を返します。例外がスローされない場合は、式全体が expression1 の値を返します。例外がスローされた場合は、各 pattern が例外と順に比較され、最初に一致したパターンについて、その分岐に対応する expression (例外ハンドラーと呼ばれます) が実行されて、式全体がその例外ハンドラー内の式の値を返します。パターンが一致しない場合、一致するハンドラーが見つかるまで、例外が呼び出し履歴の上位に伝達されます。例外ハンドラー内の各式から返される値の型は、try ブロック内の式から返される型と一致する必要があります。

多くの場合、エラーが発生すると、各例外ハンドラー内の式も有効な値を返すことができません。よく使用されるのは、式の型をオプション型にするというパターンです。このパターンを説明するコード例を次に示します。

let divide1 x y =
   try
      Some (x / y)
   with
      | :? System.DivideByZeroException -> printfn "Division by zero!"; None

let result1 = divide1 100 0

例外は、.NET の例外または F# の例外です。F# の例外を定義するには、exception キーワードを使用します。

さまざまなパターンを使用して、例外の種類や他の条件にフィルターをかけることができます。次の表はオプションの一覧です。

パターン

Description

:?exception-type

指定した .NET の例外の種類に一致します。

:?exception-type as identifier

指定した .NET の例外の種類に一致しますが、例外に名前付きの値を与えます。

exception-name(arguments)

F# の例外の種類に一致し、引数をバインドします。

identifier

任意の例外に一致し、名前を例外オブジェクトにバインドします。これは、:? System.Exception as identifier と同じです。

identifier when condition

条件が true の場合、任意の例外に一致します。

次のコード例は、さまざまな例外ハンドラー パターンを使用する方法を示しています。

// This example shows the use of the as keyword to assign a name to a
// .NET exception.
let divide2 x y =
  try
    Some( x / y )
  with
    | :? System.DivideByZeroException as ex -> printfn "Exception! %s " (ex.Message); None

// This version shows the use of a condition to branch to multiple paths
// with the same exception.
let divide3 x y flag =
  try
     x / y
  with
     | ex when flag -> printfn "TRUE: %s" (ex.ToString()); 0
     | ex when not flag -> printfn "FALSE: %s" (ex.ToString()); 1

let result2 = divide3 100 0 true

// This version shows the use of F# exceptions.
exception Error1 of string
exception Error2 of string * int

let function1 x y =
   try
      if x = y then raise (Error1("x"))
      else raise (Error2("x", 10))
   with
      | Error1(str) -> printfn "Error1 %s" str
      | Error2(str, i) -> printfn "Error2 %s %d" str i

function1 10 10
function1 9 2

[!メモ]

try...with の構成要素は、try...finally 式とは別の式です。したがって、コードに with ブロックと finally ブロックの両方を記述する必要がある場合には、この 2 つの式を入れ子にする必要があります。

[!メモ]

try...with は、非同期ワークフローおよび他のコンピュテーション式で使用できます。その場合は、try...with 式のカスタマイズされたバージョンを使用します。詳細については、「非同期ワークフロー (F#)」および「コンピュテーション式 (F#)」を参照してください。

参照

関連項目

例外の種類 (F#)

例外: try...finally 式 (F#)

その他の技術情報

例外処理 (F#)