【发布时间】:2013-09-04 15:05:38
【问题描述】:
文章https://devblogs.microsoft.com/dotnet/the-good-and-the-bad-of-exception-filters/ 建议 F# 原生支持异常过滤器(例如,在 C# 中没有语法)。异常过滤器在适当的catch块之前运行,如果它们返回true,catch块将执行。我会想象 F# 使用类似这样的东西来做到这一点
with
| ex when filter(ex) -> printfn "Caught"
但是,对我来说,它通过调用 catch 块内的过滤器函数编译为通常的“catch [mscorlib]System.Object”,并且生成的 MSIL 中不存在“过滤器”部分。那么问题来了,F# 真的支持这种结构吗?
谢谢
【问题讨论】:
-
为什么这种实现方式的内部结构对您很重要?
-
@JohnPalmer - 实施策略实际上会影响某些极端情况下的语义(由于 .NET/Windows 的两次传递模型),所以我认为这是一个非常相关的问题。
-
VB.NET 和 F# 具有相似的条件 catch 构造,但是,VB.NET 编译器发出 filter 块,而 F# 显然没有。正如@kvb 所说,这使得语义很重要,在某些情况下,尤其是互操作