Frage

Hinweis:dies ist nicht ein Duplikat von Jeff Frage.

Diese Frage gefragt: "Ist ein äquivalent?" Ich weiß es nicht, und ich will wissen warum!

Der Grund warum ich Frage ist, dass ich gerade erst klar geworden, wie wichtig es ist, und die Schlussfolgerung scheint sehr seltsam für mich.

Die Ausnahmebehandlung von Microsoft Enterprise Library rät uns zu verwenden Sie dieses Muster:

catch (Exception x)
{
    if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy))
        throw;

    // recover from x somehow
}

Die Richtlinie definiert in einer XML-Datei, so dass bedeutet, dass, wenn ein Kunde hat ein Problem, wir können ändern Sie die Politik zu unterstützen, die tracking-down (oder vielleicht übertapezieren) das problem zu geben Ihnen eine schnelle Lösung, bis wir deal mit es richtig, das kann bedeuten, zu streiten mit 3 Parteien, über wessen Schuld es alle ist.

Dies ist im Grunde eine Bestätigung der einfache Umstand, dass in realen Anwendungen die Anzahl von exception-Typen und Ihre "Werthaltigkeit" status praktisch unmöglich ist, Sie zu verwalten, ohne eine Einrichtung wie diese.

Inzwischen, das CLR-team bei MS sagt, das ist nicht eine option, und es stellt sich heraus, diese Jungs wissen, wovon Sie reden!Das problem ist, dass direkt vor der catch block läuft, werden alle finally Blöcke geschachtelt innerhalb der try block ausgeführt werden.Also diejenigen finally Blöcke können tun die folgenden:

  • Harmlos ändern Sie den Zustand des Programms (Puh, Glück gehabt).
  • Müll etwas wichtiges, die Daten des Kunden, da der Zustand des Programms eingeschraubt wird, bis zu einem unbekannten Grad.
  • Verschleiern oder zu zerstören wichtige Beweise, die wir brauchen, um ein Problem zu diagnostizieren - vor allem, wenn wir reden über Aufrufe in native code.
  • Werfen andere Ausnahme hinzufügen, um die Allgemeine Verwirrung und Elend.

Beachten Sie, dass die using Anweisung und C++/CLI Destruktoren sind gebaut auf try/finally, Sie sind also auch betroffen.

So klar die catch/throw Muster zum filtern von Ausnahmen ist nicht gut.Was tatsächlich benötigt wird, ist ein Weg, um filter Ausnahmen, über eine Politik, ohne Sie tatsächlich zu fangen und so das auslösen der Ausführung von finally Blöcke, es sei denn, wir finden eine Politik, die uns sagt, die Ausnahme ist sicher zu erholen.

Das CLR-team schrieb einen Artikel über das kürzlich:

Das Ergebnis ist, dass wir haben, schreiben Sie eine Hilfsfunktion, die in VB.NET um uns zu ermöglichen Zugriff auf diese wichtige Funktion von C#.Die große Ahnung, dass es ein problem ist, dass der code in der BCL, die dies tut.Viele Leute haben darüber gebloggt, es zu tun, aber Sie selten, wenn überhaupt, Erwähnung der Sache, über try/finally Blöcke, die ist der killer.

Was ich gerne wissen würde ist:

  • Gibt es öffentliche Aussagen oder direkten E-Mails, die Menschen erhalten haben, die von der C# - team zu diesem Thema?
  • Gibt es bestehende Microsoft Connect Anregungen bitten für diese?Ich habe Gerüchte gehört, aber keiner der wahrscheinlich keywords drehte sich alles.

Update: wie oben erwähnt, habe ich bereits gesucht auf Microsoft Connect, ohne etwas zu finden.Ich habe auch (wenig überraschend) Gegoogelt.Ich habe nur Menschen gefunden, die und erklären, warum Sie diese Funktion benötigen, oder zeigen die Vorteile der it in der VB.NET, oder vergeblich gehofft, dass es sein in einer zukünftigen version Hinzugefügt in C#, oder arbeiten, Und viel irreführende Beratung.Aber keine Aussage über die Gründe für das weglassen von allen aktuellen Versionen von C#.Und der Grund, warum ich Frage nach bestehenden treten Fragen ist also, dass (a) ich glaube nicht, erstellen Sie eine unnötige doppelte und (b) ich kann sagen, interessiert die Leute, wenn ich um eines zu erstellen.

Update 2: Finden eine interessante alte blog-post von Eric Gunnerson, früher von der C# - team:

"Ja, in der Lage zu einer Bedingung auf ein Fang ist etwas bequemer als das schreiben der test sich selbst, aber es nicht wirklich aktivieren Sie machen etwas neues."

Das war die gleiche Vermutung hatte ich, bis es richtig war, erklärte mir!

War es hilfreich?

Lösung

Wie zu jeder bestehenden Verbindung Fehler.Die folgende Frage beschäftigt sich mit Ausnahme fliters.Der Nutzer nicht ausdrücklich, Sie wollten Sie sein, eine tatsächliche filter in den Sinn, wenn Sie ausführen, aber IMHO ist es durch die implizierte Logik.

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=401668

Neben diesem Problem gibt es aber keine Probleme, die ich finden kann oder weiß, das sind in Bezug auf das, was Sie suchen.Ich denke, es würde gut tun, um eine separate Frage, die explizit fordert Sie heraus, die wollen für VB.Net Stil Ausnahme filtern.

Ich würde nicht sorgen zu viel über die Einführung einer doppelten Frage, wenn Sie getan haben ein bisschen von due diligence auf der Suche für ein bereits vorhandenes.Wenn es ein dupe, Mads wird dupe es entsprechend und verknüpfen Sie zu den wichtigsten Wunsch.

Für das Teil zu bekommen, eine offizielle Antwort aus dem C# - team, Sie werden wahrscheinlich bekommen, wenn Sie entweder 1) - Datei eine Verbindung bug oder 2) hinters Licht geführt zu werden gegen die wichtigsten Fehler.Ich bezweifle wirklich, es ist eine offizielle Begründung / Rechtfertigung heraus dort im Augenblick.

Hier ist meine Spekulation auf die Frage:Meine Vermutung ist, dass diese Funktion einfach nicht auf das original-C# 1.0 feature-set und seit dieser Zeit gibt es noch nicht genug Nachfrage, um es in der Sprache.Die C# - und VB-team verbringen unglaublich viel Zeit-ranking-features für die Sprache zu Beginn jedes Schiff-Zyklus.Wir haben einige sehr schwierige Schnitte in Zeiten.Ohne ausreichende Nachfrage gibt es sehr wenig chance, eine Funktion wird es in der Sprache.

Bis vor kurzem haben ich Wette, Sie würden hart gedrückt zu finden, die 1 von 10 Menschen, die verstanden den Unterschied zwischen VB.Net's Try/Wenn und nur mit einem einfachen alten if-Anweisung in C# - catch-block.Es scheint ein bisschen mehr auf den Köpfen in letzter Zeit so vielleicht wird es in einer zukünftigen version der Sprache.

Andere Tipps

Mit Exception Filter Injizieren sein kann einfacher als mit dem Delegaten Abhilfe.

Für eine echte Antwort auf Ihre Frage erhalten Sie eine Antwort von Anders Hejlsberg benötigen, oder jemand, der in dem ursprünglichen Entwurf Treffen war. Sie könnten sehen, versuchen Sie, wenn Sie können es durch den Kanal 9 Interviewer nächste Mal gefragt, das C # Design-Team interviewt .

Ich würde vermuten, dass, wenn die ursprüngliche Entscheidung getroffen wurde, Ausnahmefilter als eine unnötige Komplikation zu sehen waren, die mehr schaden als nützen könnten. Sie können natürlich auch den Wunsch, zu bleiben ‚stillen‘ über unbewiesene Funktionen in diesem Interview über die Entscheidung sehen nicht geprüfte Ausnahmen zu unterstützen: The Trouble with Checked Ausnahmen .

Ich denke, die postmoterm Diagnoseszenarien stark argumentieren Zugriff auf Ausnahmefilter in der Sprache für die Bereitstellung. Allerdings können diese Szenarien nicht zu der Zeit artikuliert wurden. Auch müssen diese Szenarien wirklich richtige Werkzeugunterstützung, die sicherlich in V1 nicht verfügbar war. Schließlich kann es zu groß Negativ sein über diese Funktion hinzufügen, die wir in Betracht ziehen nicht.

Wenn kein connect Bug auf das ist, sollten Sie eine eingeben und andere ermutigen, ihn zu stimmen oben. [Ich würde empfehlen, für den Zugriff auf die CLR-Funktion zu fragen, anstatt zu versuchen zu entwerfen, wie es in der Sprache paßt.]

Ich glaube nicht, dass Java entweder eine Filteroption hat. Erraten, dass wenn es so wäre, haben wir auch eine in C # sehen würde. VB.net hat wahrscheinlich eine zufällig gegeben, dass das VB-Team mit einer sauberen Weste gestartet.

Eine Sache, die so weit zu Ihren Gunsten funktionieren könnte diese Option in einer zukünftigen Version von C # als gewinnt, ist Microsofts erklärtes Ziel Parität zwischen laguage Funktionen in zukünftigen Versionen von C # und VB.net zu halten. Ich würde mein Argument vorbringen, bezogen auf das.

http://www.chriseargle.com/post /2009/01/Parity-Between-Languages.aspx

In Bezug auf die erste Frage, ob es eine öffentliche Erklärung war, dann war es mehr als wahrscheinlich, setzen auf dem Netz irgendwo, in diesem Fall sollten Google etwas aufdrehen (falls vorhanden).

Wenn es sich um eine direkte E-Mail mit dem C # Team ist, dann ist es mehr als wahrscheinlich, dass es unter NDA ist, so wäre es nicht in der Lage sein, sowieso veröffentlicht werden.

Mit der zweiten Frage gibt es eine Suchfunktion auf Microsoft Connect, die sie auffordern, bevor zu verwenden, um einen neuen Vorschlag eingeben. Wenn Sie es nicht finden können, dann gibt es wahrscheinlich nicht ein.

Meine Empfehlung wäre, einen Vorschlag zu setzen in, und dann zu fördern, um andere zu bekommen auf sie zu wiegen.

Als ich sie im Moment des rethrow verstehen, werden die schließlich Handler in den inneren Funktionen ausgeführt und das ist, was Probleme für Sie erstellt.

Aber lassen Sie uns sagen, dass Sie eine Ausnahme-Filter haben, der die Ausnahme durchläuft, ohne es wirklich Erneutes Auslösen. Sie werden immer noch irgendwie irgendwo zu behandeln haben, und Sie werden in den gleichen Arten von Problemen (schließlich Effekte) dort ausgeführt werden.

Also, wenn ich etwas Missverständnis, es ist nicht ein großer Gewinn von Sprachgestützte Ausnahmefilter mit.

Ich kann zumindest zwei Gründe vorstellen, warum Ausnahme Filterung von C # fehlt

  1. Zulassen Ausnahme Filter könnten Programmierer ermutigen Dinge während First-Pass-Ausnahmebehandlung zu tun, die zu diesem Zeitpunkt nicht sicher sein würden, auch wenn sie in einem ‚catch‘ oder ‚schließlich‘ sicher durchgeführt werden können. Zum Beispiel, wenn Code innerhalb des „Try“ Block eine Sperre erfasst und löst eine Ausnahme während der Sperre gehalten wird, wird die Sperre während der Ausführung der äußeren Ausnahme Filter gehalten werden, wird aber vor einer äußeren „fangen“ freigegeben oder „endlich "Block ausgeführt wird. Auch zumindest das letzte Mal habe ich geprüft, Ausnahmen, die innerhalb eines Ausnahmefilter aufgetreten und nicht gefangen in sich still erstickt wurden - so etwas wie eine hässliche Situation.
  2. Die Implementierer von C # haben eine Vision, ihre Sprache ‚Rahmen Agnostiker‘. Wenn C # .net First-Pass-Ausnahme-Filterung unterstützt, Programme, die diese Funktion verwendet, könnten unbrauchbar auf Gerüste sein, die Ausnahmen unterschiedlich behandeln. Dies ist der gleiche Grund, dass C # verbietet Programme überschreiben `Object.Finalize ()`. Während die Argumentation rund um `Object.Finalize ()` fehlerhaft ist (korrekte Verwendung von Destruktoren Verwendung anderer plattformspezifischen Methoden erfordert, so die Verwendung von destructor Syntax erfordert für `Object.Finalize ()` erreicht nichts, außer das Schreiben von t77o zu fördern fehlerhafte Software) macht die Argumentation einen Sinn im Hinblick auf die Ausnahmefilter machen. Auf der anderen Seite, die richtige Art und Weise mit diesem Thema zu befassen würde einige Ausnahme-Filter-bezogene Funktionen aussetzen, selbst wenn man nicht direkt Ausnahme Filter ausgesetzt hat.

Ein Feature, das ich wirklich möchte in C # und VB, um zu sehen, was die Verwendung von Ausnahmefilter zu implementieren, erfordern würde, aber was sich direkt nicht erfordern auszusetzen, wäre ein optionaler Exception Parameter für einen finally Block sein. Dieser Parameter würde null werden, wenn keine abgefangene Ausnahme auftritt; andernfalls würde sie die Ausnahme in Frage halten. Dies würde für Situationen ermöglichen, wo ein Programm will, etwas zu tun, wenn eine Ausnahme auftritt, aber nicht wirklich „Griff“ es. In den meisten Fällen würde der Exception Parameter nicht für alles verwendet werden, außer für null zu überprüfen (dh die Funktion fault Blöcke auszusetzen entsprechen würde), aber es würde Vorteile in Fällen bieten, wo eine Ausnahme während der Bereinigung stattfindet. Gegenwärtig, wenn eine Ausnahme während eines finally Block auftritt, ist es notwendig, entweder den finally-Block Ausnahme zu ersticken oder die bereits bestehende überschrieben. die frühere Ausnahme zur Verfügung, den finally Blockcode es entweder wickeln ermöglichen würde, oder es loggt sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top