Der Artikel Ссылка schlägt vor, dass F # nativ Fehlerfilter unterstützt (die z. B. keine Syntax in C # haben). Ausnahmefilter führen vor den entsprechenden catch-Block aus, und wenn sie true zurückgeben, wird der catch-Block ausgeführt. Ich könnte mir vorstellen, dass F # dies mit so etwas macht.
%Vor%Allerdings kompiliert es für mich zu dem üblichen "catch [mscorlib] System.Object" mit einem Aufruf der Filterfunktion innerhalb des catch-Blocks und kein "filter" -Abschnitt ist in generierter MSIL vorhanden. Die Frage ist also, ob F # wirklich dieses Konstrukt unterstützt?
Danke
Soweit ich weiß, implementiert / verwendet F # die in MSIL verfügbaren filter
-Handler nicht (siehe auch Abschnitt 12.4.2 "Ausnahmebehandlung") / em>). Laut Abschnitt 6.9.21 der F # 3.0-Sprachspezifikation soll der Compiler die gesamte with
kompilieren. Klausel in einen catch
-Block; Ein "Fall-Through" -Fall wird dem kompilierten Code hinzugefügt, sodass, wenn die abgefangene Ausnahme keinem der Muster in der with
-Klausel entspricht, sie erneut ausgelöst wird (über die Anweisung rethrow
IL).
Das heißt, ich würde wirklich gerne sehen, dass F # mehr Low-Level-IL / CLR-Konstrukte unterstützt - sie werden nicht oft verwendet, aber manchmal bieten sie die einzige Möglichkeit, etwas richtig zu implementieren, oder sie vermeiden die Notwendigkeit komplizierte Workarounds; und wie im Fall des OP ist es wichtig, dass F # diese für die Interoperabilität unterstützt. Zum Beispiel wäre try...fault
wirklich nützlich für die Protokollierung, und es würde einige Bits Code vereinfachen, die try...finally
mit zusätzlicher Logik verwenden müssen (zB die Implementierung von lock
in FSharp.Core
).
UPDATE: Ich habe mich nur nach Informationen zu einem ganz anderen Thema umgeschaut und bin seit 2006 auf Dons Blog über diesen Post gestolpert: F # 1.1.13 jetzt verfügbar! (siehe auch begleitend Versionshinweise ). Natürlich war F # 1.1.13 eine sehr frühe Version der Sprache, und zu diesem Zeitpunkt war sie noch recht experimentell, aber es ist interessant zu sehen, dass der Compiler einmal einen --generate-filter-blocks
switch hatte.