2016-11-01 3 views
1

私はF#でtry-withを理解しようとしています。私が理解しているように、tryの戻り値の型はwithの戻り値の型と同じでなければなりません。F#try-withとreraise()は有効な型を返します。どうして?

しかし、私はこのような何かをするときということ、それがある理由:

let safeIndexTry (anArray : array<'a>) (i : int) = 
    try 
    Array. item i anArray 
    with 
    | :? System.IndexOutOfRangeException as ex -> printfn "%s" ex.Message 
                reraise() 

その後、私はそれを把握することができますよう。 reraise()は戻り値を有効な型に変換します。この場合はintです。しかし、それはなぜですか?それはすべてのタイプのためにそれを行うリレイズですか?

一般的に私は2つが同じ戻り値の型を持たなければならないということが少し問題です。私はいつもあなたはいくつかの値を計算したいと思うし、文字列メッセージをスローする例外をキャッチすることができない場合。いくつか私に指導を与えることができますか?

答えて

3

reraiseは、このように定義されています

reraise : unit -> 'T 

その結果タイプは、それが返されるから包括的な機能の種類に合ったことを意味します。例外がスローされるため、その戻り値は多かれ少なかれ無意味です。ハスケルのような言語では、それはbottomと考えることができます。

関数の結果型が同じである必要があるため、返す慣用的な値はOption型になります。例外がキャッチされた場合はNoneを返し、操作が成功した場合はSome goodValueを返します。すべての呼び出し元が例外処理ラッパーですべての呼び出しコードをラップするのではなく、すべての呼び出し元がNoneとの両方の場合を明示的に処理する必要があるため、このイディオムが例外を使用するよりも制御フローを処理する方がはるかに優先されます。ここで

Optionを使用するように変換した場合、あなたの関数は次のようになります。

let safeIndexTry (anArray : array<'a>) (i : int) : 'a option = 
    try 
    Some <| Array. item i anArray 
    with 
    | :? System.IndexOutOfRangeException as ex -> None 
+0

あなたは、このどれも、いくつかの例外処理を説明することはできませんか?私は本当にこれを理解したいと思います。 – Nulle

+1

私は 'Option'を使用した例を追加しました –

+0

ありがとう! – Nulle

関連する問題