2013-09-01 14 views
8

記事http://blogs.msdn.com/b/dotnet/archive/2009/08/25/the-good-and-the-bad-of-exception-filters.aspxは、F#が(たとえばC#で構文を持たない)例外フィルタをネイティブにサポートしていることを示しています。例外フィルタはの前にの適切なcatchブロックを実行し、trueを返すとcatchブロックが実行されます。私はF#が、これは F#例外フィルタ

このような
with 
    | ex when filter(ex) -> printfn "Caught" 

何かを使用すると、しかし、私にとってそれはcatchブロック内のフィルタ関数の呼び出しなし「フィルタと「[mscorlib] System.Objectのをキャッチする」通常にコンパイルん想像します"セクションが生成されたMSILに存在します。だから問題は、F#は本当にこの構造をサポートしているのでしょうか?

おかげ

+1

これはなぜ実装されているの内部はあなたにとって重要ですか? –

+3

@ JohnPalmer - 実装戦略は実際にはいくつかのコーナーケース(.NET/Windowsの2パスモデルのため)でセマンティクスに影響を与えます。 – kvb

+0

VB.NETとF#は同様の条件付きキャッチ構造を持っていますが、VB.NETコンパイラは_filter_ブロックを生成し、F#は明らかにそうではありません。これは、@kvbがそれを置いたように、セマンティクスを問題にします。 – actionresult

答えて

4

私の知る限りでは、F#は、実際に実装されていません/ MSILで利用可能な利用/公開filterハンドラ(ECMA-335、第5版、パーティションI、12.4.2項「例外処理")。 F# 3.0 language specificationのセクション6.9.21によれば、コンパイラはブロックにwith節全体をコンパイルすることになっています。キャッチされた例外がwith句のいずれのパターンとも一致しない場合は、rethrow IL命令を介して再発生されるように、コンパイルされたコードに「フォールスルー」のケースが追加されます。

私は、F#がより低レベルのIL/CLR構造をサポートしていることを本当に見たいと思っています。それらは頻繁に使用されることはありませんが、何かを正しく実装する唯一の方法を提供したり、複雑な回避策については、 OPの場合のように、F#が相互運用性の目的でこれらをサポートすることが重要です。例えば、try...faultは、実際にはロギングの目的で便利であり、追加のロジックを持つtry...finally(たとえば、FSharp.Coreに実装されたlock)を使用する必要があるコードの一部を簡略化します。

更新:まったく別のトピックに関する情報を探していただけで、2006年からDonのブログ:F# 1.1.13 now available!(これも添付のrelease notesを参照)に掲載されました。もちろん、F#1.1.13は非常にの初期バージョンでしたが、その時点でまだかなり実験的でしたが、コンパイラが一度--generate-filter-blocksスイッチを持っていたことは興味深いです。

関連する問題