Artykuł http://blogs.msdn.com/b/dotnet/archive/2009/08/25/the-good-and-the-bad-of-exception-filters.aspx sugeruje, że F # natywnie obsługuje filtry wyjątków (które nie mają na przykład składni w języku C#). Filtry wyjątków uruchamiają odpowiedni blok catch, a jeśli zwrócą wartość true, blok catch zostanie wykonany. Mogę sobie wyobrazić, F # robi to przy użyciu coś takiegoFiltry wyjątków F #
with
| ex when filter(ex) -> printfn "Caught"
Jednak dla mnie to kompiluje się zwykle „złapać [mscorlib] System.Object” przy wywołaniu funkcji filtra wewnątrz bloku catch i bez filtra” "Sekcja jest obecna w generowanym zbiorze MSIL. Pytanie brzmi, czy F # naprawdę wspiera tę konstrukcję?
Dzięki
Dlaczego internals w sposobie, w jaki jest to realizowane, mają dla ciebie znaczenie? –
@JohnPalmer - strategia implementacji faktycznie wpływa na semantykę w niektórych przypadkach narożnych (z powodu dwuprzebiegowego modelu .NET/Windows), więc myślę, że jest to dość istotne pytanie. – kvb
VB.NET i F # mają podobne warunkowe konstrukcje catch, jednak kompilator VB.NET emituje _filter_ bloki, a F # najwyraźniej nie. To sprawia, że semantyka ma znaczenie, jak to określił @kvb, w niektórych przypadkach, szczególnie w przypadku współpracy – actionresult