gpt4 book ai didi

exception - F# 异常过滤器

转载 作者:行者123 更新时间:2023-12-02 22:57:52 26 4
gpt4 key购买 nike

文章https://devblogs.microsoft.com/dotnet/the-good-and-the-bad-of-exception-filters/表明 F# 本身支持异常过滤器(例如,在 C# 中没有语法)。异常过滤器在适当的 catch block 之前运行,如果它们返回 true,则 catch block 将执行。我想 F# 使用类似的东西来做到这一点

with
| ex when filter(ex) -> printfn "Caught"

但是,对我来说,它会编译为通常的“catch [mscorlib]System.Object”,并调用 catch block 内的过滤器函数,并且生成的 MSIL 中不存在“过滤器”部分。所以问题是,F# 真的支持这种构造吗?

谢谢

最佳答案

据我所知,F# 实际上并未实现/使用/公开 MSIL 中可用的 filter 处理程序(ECMA-335,第 5 版,第 I 部分,第 12.4.2 节“异常处理”)。根据F# 3.0 language specification第6.9.21节,编译器应该将整个 with 子句编译成 catch block ; “fall-through”情况被添加到编译的代码中,以便如果捕获的异常与 with 子句中的任何模式都不匹配,则会重新引发(通过 rethrow IL 指令)。

也就是说,我真的很希望看到 F# 支持更多低级 IL/CLR 构造——它们并不经常使用,但有时它们提供了正确实现某些内容的唯一方法,或者它们避免了需要复杂的解决方法;而且,正如 OP 的情况一样,为了实现互操作性,F# 支持这些非常重要。例如,try...fault 对于日志记录来说确实很方便,并且它会简化当前需要使用 try...finally 和附加功能的一些代码。逻辑(例如,FSharp.Corelock 的实现)。

更新:我只是在搜索有关完全不同主题的信息,并在 Don 的博客上看到了 2006 年的这篇文章:F# 1.1.13 now available! (另请参阅随附的 release notes )。当然,F# 1.1.13 是该语言的非常版本,当时它仍然处于实验阶段,但有趣的是编译器曾经有一个 --generate -filter-blocks 开关。

关于exception - F# 异常过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com