文章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#会用这样的东西做这个
with
| ex when filter(ex) -> printfn "Caught"
Run Code Online (Sandbox Code Playgroud)
但是,对我来说,它编译为通常的"catch [mscorlib] System.Object",调用catch块中的过滤器函数,并且生成的MSIL中不存在"过滤器"部分.所以问题是,F#真的支持这种结构吗?
谢谢
据我所知,F# 实际上并未实现/使用/公开filterMSIL 中可用的处理程序(ECMA-335,第 5 版,第 I 部分,第 12.4.2 节“异常处理”)。根据F# 3.0 语言规范第 6.9.21 节,编译器应该将整个with子句编译成一个catch块;将“失败”情况添加到编译的代码中,以便如果捕获的异常与子句中的任何模式都不匹配with,则会重新引发该异常(通过rethrowIL 指令)。
也就是说,我真的很希望看到 F# 支持更多低级 IL/CLR 构造——它们并不经常使用,但有时它们提供了正确实现某些内容的唯一方法,或者它们避免了复杂的解决方法的需要;而且,正如 OP 的情况一样,为了实现互操作性,F# 支持这些非常重要。例如,try...fault对于日志记录来说确实很方便,并且它会简化当前需要与附加逻辑一起使用的一些代码(例如, intry...finally的实现)。lockFSharp.Core
更新:我只是在搜索有关完全不同主题的信息,并在 Don 的博客上看到了 2006 年的这篇文章:F# 1.1.13 现已可用!(另请参阅随附的发行说明)。当然,F# 1.1.13 是该语言的一个非常早期的版本,当时它仍然处于实验阶段,但有趣的是,编译器曾经有一个--generate-filter-blocks开关。
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |