簡體   English   中英

F# 異常過濾器

[英]F# exception filters

文章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# 真的支持這種結構嗎?

謝謝

據我所知,F# 實際上並沒有實現/使用/公開 MSIL 中可用的filter處理程序( ECMA-335,第 5 版,第 I 部分,第 12.4.2 節“異常處理” )。 根據F# 3.0 語言規范的第 6.9.21 節,編譯器應該將整個with子句編譯成一個catch塊; 一個“失敗”的情況被添加到編譯的代碼中,這樣如果捕獲的異常with子句中的任何模式都不匹配,它就會被重新引發(通過rethrow IL 指令)。

也就是說,我真的很希望看到 F# 支持更多的低級 IL/CLR 構造——它們不經常使用,但有時它們提供了正確實現某些東西的唯一方法,或者它們避免了對復雜變通方法的需要; 並且,在 OP 的情況下,重要的是 F# 支持這些以實現互操作性。 例如, try...fault對於日志記錄來說真的很方便,它會簡化一些當前需要使用try...finally的代碼,並帶有附加邏輯(例如,在FSharp.Core實現lock )。

更新:我只是在四處尋找有關完全不同主題的信息,並在 Don 的博客上看到了 2006 年的這篇文章: F# 1.1.13 現在可用! (另請參閱隨附的發行說明)。 當然,F# 1.1.13 是該語言的一個非常早期的版本,當時它仍然處於實驗階段,但有趣的是,編譯器曾經有一個--generate-filter-blocks開關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM