try...with式の概要
このトピックでは、F#で使用される例外処理のための式であるtry...with式を紹介します。
// ------------------
// [ 構文 ]
// ------------------
try
trying-expressions
with
| pattern1 -> expression1
| pattern2 -> expression2
...
前述したとおりtry...with式は、例外を処理するために使用される式です。このtry...with式は、C#のtry-catch文に似ています。上記の構文では [try-expressions] に例外が発生する可能性のあるコードが記述されます。また、[try-expressions] の式は値を返します。例外が投げられた場合(= throw)、with句内の各パターンが順番に例外と比較され、最初に一致したパターンの式が実行されます。このwith句内の式のことを「例外ハンドラ」とも言います。例外ハンドラの返り値の型は、[try-expressions] で返されるはずの値の型と一致していなければならないことに注意が必要です。
例外が発生したという事実は、多くの場合、各例外ハンドラの式から返すことができる有効な値がないことを意味しています。そのため、例外処理を行う際に、返り値の型をoption型にするというパターンがよく使われます。以下は、その一例です。
発生しうる例外が.NET例外でも、F#例外でもtry...with式を利用することができます。また、exceptionキーワードを利用してオリジナルのF#例外を定義することも可能です。
また、with句のパターンには、以下のようなパターンマッチを利用することができ、目的の例外の種類や条件を指定してフィルタリングが可能です。
パターン | 説明 |
---|---|
:? exception-type | 指定された.NET例外型にマッチします. |
:? exception-type as identifier | 指定された.NET例外型にマッチします. また, identifierで指定した値に例外値を束縛します. |
exception-name (arguments) | F#例外型にマッチします. また, argumentsに例外からの値を束縛します. |
identifier | すべての例外にマッチします. また, identifierにその例外そのものを束縛します. このマッチングは「:? System.Exception as idetifier」と同等です. |
identifier when condition | when句の条件に一致する, すべての例外にマッチします. |
サンプルでみるtry...with式
以下はさまざまな例外ハンドラパターンの利用方法を示しています。
(1) [ :? exception-type as identifier ] 例外パターン
【exception-type】にはマッチングさせたい例外の型を、【identifier】には例外ハンドラで利用する際の例外の値名を指定します。また、値名は好きな名前をつけることが可能です。
(2) [ identifier when condition ] 例外パターン
【condition】には、真偽値もしくは真偽値を表す式を指定します。例外ハンドラのパターンマッチをする際に真偽値がtrueの場合にのみマッチします。
(3) [ exception-name (arguments) ] 例外パターン