Frage

Das ist wirklich, urks mich wirklich, so dass ich hoffe, dass mir jemand eine vernünftige Rechtfertigung geben kann, warum die Dinge sind wie sie sind.

NotImplementedException. Sie ziehen mein Bein, nicht wahr?

Nein, ich werde nicht auf diesem billigen Stich nehmen, indem er sagt: „Moment mal, ist das Verfahren implementiert -. Es wirft einen NotImplementedException“ Ja, das ist richtig, müssen Sie die Methode implementieren eine NotImplementedException zu werfen (im Gegensatz zu einem rein virtuellen Funktionsaufruf in C ++ - nun, das macht Sinn). Während das ist verdammt lustig, gibt es ein ernsteres Problem in meinem Kopf.

Ich frage mich nur, in der Gegenwart des NotImplementedException, wie kann jemand etwas mit .Net tun? Werden erwartet, dass Sie jeden abstrakten Methodenaufruf mit einem Try-Catch-Block wickeln gegen Methoden zu schützen, die nicht umgesetzt werden könnte? Wenn Sie eine solche Ausnahme zu fangen, was zum Teufel soll man damit tun ??

Ich sehe keine Möglichkeit, zu testen, ob ein Verfahren tatsächlich ohne nennt es umgesetzt wird. Da nenne es Nebenwirkungen haben kann, kann ich up-front all meine Schecks nicht tun und dann meinen Algorithmus auszuführen. Ich muss meinen Algorithmus, fangen NotImplementedExceptions und einige, wie ein Rollback meine Anwendung zu einem gewissen gesunden Zustand ausgeführt werden.

Es ist verrückt. Wütend. Wahnsinnig. Die Frage ist also: Warum wird die NotImplementedException existieren

Als Präventivschlag, ich will nicht, dass jemand mit reagieren „weil Designer müssen diese setzen in den automatisch generierten Code.“ Das ist schrecklich. Ich würde eher der automatisch generierten Code nicht kompiliert werden, bis Sie eine Implementierung liefern. Zum Beispiel erzeugt die automatische Implementierung könnte „werfen NotImplementedException;“ wo die NotImplementedException nicht definiert ist!

Hat jemand schon einmal gefangen und behandelt ein NotImplementedException? Haben Sie jemals einen NotImplementedException in Ihrem Code links? Wenn ja, haben diese eine Zeitbombe dar (dh links Sie versehentlich es dort) oder ein Konstruktionsfehler (die Methode nicht implementiert werden soll und wird nie genannt werden)?

Ich bin sehr misstrauisch gegenüber der NotSupportedException auch ... nicht unterstützt? Was zum? Wenn es nicht unterstützt wird, warum ist es Teil Ihrer Schnittstelle? Kann jemand bei Microsoft unangebrachter Vererbung buchstabieren? Aber ich könnte noch eine Frage beginnen, wenn ich auch nicht für diesen einen bekommen zu missbrauchen.

Weitere Informationen:

diese ist eine interessante Lektüre zu diesem Thema.

Es scheint mit Brad Abrams eine starke Zustimmung zu sein , dass „NotImplementedException ist für Funktionalität, die nur noch nicht implementiert ist, aber eigentlich sollte (und wird). So etwas, was Sie vielleicht starten mit, wenn Sie eine Klasse erstellen, erhalten alle Methoden gibt NotImplementedException wirft, dann spülen sie diese mit echtem Code aus ... "

Kommentare von Jared Parsons sehr schwach sind und wahrscheinlich ignoriert werden soll: NotImplementedException: diese Ausnahme werfen, wenn ein Typ kein Verfahren aus einem anderen Grunde nicht implementiert

.

Die MSDN ist noch schwächer zu diesem Thema, lediglich die besagt, dass „die Ausnahme, die eine angeforderte Methode oder Operation ausgelöst wird, wenn nicht umgesetzt wird.“

War es hilfreich?

Lösung

Es ist eine Situation, die wir finden es nützlich. TDD

Ich schreibe meine Tests, dann ich Stubs erstellen, damit die Tests zusammenstellen. Diese Stubs tun nichts anderes als throw new NotImplementedException();. Auf diese Weise der Tests werden standardmäßig scheitern, egal was passiert. Wenn ich einige Dummy-Rückgabewert verwendet wird, könnte es falsch positive Ergebnisse generieren. Nun, da alle Tests kompilieren und scheitern, weil es keine Implementierung ist, gerät ich diese Stubs.

Da ich nie ein NotImplementedException in jeder anderen Situation nutzt, wird keine NotImplementedException jemals auf Freigabe-Code übergeben, da es immer einig Test nicht machen.

Sie brauchen nicht, es zu fangen alle über den Ort. Gute APIs dokumentieren die Ausnahmen geworfen. Das sind die, die Sie suchen sollten.

EDIT:. Ich schrieb einen FxCop Regel, sie zu finden

Dies ist der Code:

using System;
using Microsoft.FxCop.Sdk;

/// <summary>
/// An FxCop rule to ensure no <see cref="NotImplementedException"/> is
/// left behind on production code.
/// </summary>
internal class DoNotRaiseNotImplementedException : BaseIntrospectionRule
{
    private TypeNode _notImplementedException;
    private Member _currentMember;

    public DoNotRaiseNotImplementedException()
        : base("DoNotRaiseNotImplementedException",
               // The following string must be the assembly name (here
               // Bevonn.CodeAnalysis) followed by a dot and then the
               // metadata file name without the xml extension (here
               // DesignRules). See the note at the end for more details.
               "Bevonn.CodeAnalysis.DesignRules",
               typeof (DoNotRaiseNotImplementedException).Assembly) { }

    public override void BeforeAnalysis()
    {
        base.BeforeAnalysis();
        _notImplementedException = FrameworkAssemblies.Mscorlib.GetType(
            Identifier.For("System"),
            Identifier.For("NotImplementedException"));
    }

    public override ProblemCollection Check(Member member)
    {
        var method = member as Method;
        if (method != null)
        {
            _currentMember = member;
            VisitStatements(method.Body.Statements);
        }
        return Problems;
    }

    public override void VisitThrow(ThrowNode throwInstruction)
    {
        if (throwInstruction.Expression != null &&
            throwInstruction.Expression.Type.IsAssignableTo(_notImplementedException))
        {
            var problem = new Problem(
                GetResolution(),
                throwInstruction.SourceContext,
                _currentMember.Name.Name);
            Problems.Add(problem);
        }
    }
}

Und das ist die Regel Metadaten:

<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="Bevonn Design Rules">
  <Rule TypeName="DoNotRaiseNotImplementedException" Category="Bevonn.Design" CheckId="BCA0001">
    <Name>Do not raise NotImplementedException</Name>
    <Description>NotImplementedException should not be used in production code.</Description>
    <Url>http://stackoverflow.com/questions/410719/notimplementedexception-are-they-kidding-me</Url>
    <Resolution>Implement the method or property accessor.</Resolution>
    <MessageLevel Certainty="100">CriticalError</MessageLevel>
    <Email></Email>
    <FixCategories>NonBreaking</FixCategories>
    <Owner></Owner>
  </Rule>
</Rules>

Zum Aufbau dieses müssen Sie:

  • Referenz Microsoft.FxCop.Sdk.dll und Microsoft.Cci.dll

  • Setzen Sie die Metadaten in einer Datei mit dem Namen DesignRules.xml und fügen Sie es als eingebettete Ressource zu Ihrer Assembly

  • Name der Assembly Bevonn.CodeAnalysis. Wenn Sie unterschiedliche Namen für entweder die Metadaten oder die Assembly-Dateien verwenden möchten, stellen Sie sicher, dass Sie den zweiten Parameter entsprechend dem Basiskonstruktor ändern.

Dann fügen Sie einfach die resultierende Anordnung auf Ihre FxCop Regeln und nehmen diese verdammten Ausnahmen aus Ihrem kostbaren Code. Es gibt einige Ecke Fälle, in denen es keine NotImplementedException berichten, wenn man geworfen wird, aber ich glaube wirklich, Sie sind hoffnungslos, wenn Sie tatsächlich so cthulhian Code zu schreiben sind. Für den normalen Gebrauch, das heißt throw new NotImplementedException();, es funktioniert, und das ist alles, was zählt.

Andere Tipps

Es ist einen ziemlich häufigen Anwendungsfall, eine Arbeits zu unterstützen, aber nur teilweise fertig gestellten API. Ich sage Entwickler möge, dass mein API testen und zu bewerten - WashDishes() Werke, zumindest auf meinem Rechner, aber ich habe nicht um noch Codierung bis DryDishes(), geschweige denn PutAwayDishes() bekommen. Anstatt still versagt, oder eine kryptische Fehlermeldung zu geben, kann ich ganz klar sein, warum DryDishes() funktioniert nicht. - Ich habe es noch nicht implementiert

Seine Schwester Ausnahme NotSupportedException sinnvoll vor allem für Anbieter Modelle. Viele Spülmaschinen haben eine Trocknungsfunktion, gehört so in die Schnittstelle, aber mein Rabatt Geschirrspüler es nicht unterstützt. Ich kann lassen, dass über die NotSupportedException bekannt sein

Ich werde meine Meinung dazu an einem Ort zusammenfassen, da sie in ganz wenigen Kommentare verstreut sind:

  1. Sie verwenden NotImplementedException um anzuzeigen, dass ein Schnittstellenelement noch nicht implementiert, sondern wird. Sie kombinieren diese mit automatisierten Unit-Tests oder QA-Testfunktionen zu identifizieren, die noch umgesetzt werden müssen.

  2. Sobald die Funktion implementiert ist, können Sie die NotImplementedException entfernen. Neue Unit-Tests sind für die Funktion geschrieben, um sicherzustellen, dass es funktioniert.

  3. NotSupportedException wird in der Regel für die Anbieter verwendet, die Funktionen nicht unterstützen, die für bestimmte Arten nicht sinnvoll. In diesen Fällen werfen die spezifischen Typen die Ausnahme, fangen die Kunden sie und behandeln sie als angemessen.

  4. Der Grund, dass sowohl NotImplementedException und NotSupportedException im Rahmen existieren, ist einfach: Die Situationen, die zu ihnen führen, sind häufig, so macht es Sinn, sich im Rahmen zu definieren, so dass die Entwickler müssen nicht halten Neudefinition Sie. Außerdem macht es einfach für die Kunden zu wissen, welche Ausnahme (insbesondere im Zusammenhang mit einem Unit-Test) zu fangen. Wenn Sie eine eigene Ausnahme haben zu definieren, müssen sie herausfinden, welche Ausnahme zu fangen, die zumindest eine kontraproduktive Zeit Enke ist und häufig falsch.

  

Warum funktioniert die NotImplementedException   gibt es?

NotImplementedException ist eine gute Möglichkeit, zu sagen, dass etwas noch nicht bereit ist. Warum es nicht bereit ist, ist eine andere Frage für Autoren Methode. In Produktionscode ist es unwahrscheinlich, diese Ausnahme zu fangen, aber wenn man Sie tat sofort sehen, was passiert ist, und es ist viel besser, als zu versuchen, herauszufinden, warum Methoden genannt wurde, aber es ist nichts passiert oder noch schlimmer - erhalten eine „vorübergehende“ Ergebnis und erhalten "funny" Nebenwirkungen.

  

Ist NotImplementedException der C #   Äquivalent von Java   UnsupportedOperationException?

Nein, .NET hat NotSupportedException

  

Ich habe meinen Algorithmus laufen, fangen   NotImplementedExceptions und einige   Wie rollen meine Anwendung einige zurück   sane Zustand

Gute API hat XML Methoden Dokumentation, die möglichen Ausnahmen beschrieben.

  

Ich bin sehr misstrauisch die   auch NotSupportedException ... Nicht   unterstützt? Was zum? Wenn es nicht   unterstützt, warum ist es Teil Ihrer   Schnittstelle?

Es kann Millionen Gründe. Zum Beispiel können Sie eine neue Version von API einführen und wollen nicht / kann nicht alten Methoden unterstützen. Auch hier ist es viel besser beschreibende Ausnahme zu sehen, dann eher in der Dokumentation zu graben oder 3rd-Party-Code debuggen.

Die Hauptanwendung für eine NotImplementedException Ausnahme ist in generierten Stub-Code: auf diese Weise Sie nicht vergessen, sie umzusetzen !! Zum Beispiel wird Visual Studio eines Schnittstelle Methoden / Eigenschaften explizit implementieren mit dem Körper eine NotImplementedException werfen.

Re NotImplementedException - dies dient dazu, ein paar Anwendungen; es bietet eine einzige Ausnahme, die (zum Beispiel) die Komponententests auf der unvollständige Arbeit sperren. Aber auch, es wirklich tut, was ist, sagt: Das ist einfach nicht da ist (noch) nicht. Zum Beispiel: „mono“ wirft das alles über den Ort für Methoden, die in dem MS-Libs existieren, haben aber noch nicht geschrieben.

Re NotSupportedException - nicht alles ist vorhanden. Beispielsweise unterstützen viele Schnittstellen ein Paar „können Sie das tun?“ / "mach das". Wenn die „können Sie das tun?“ false zurückgibt, ist es durchaus sinnvoll für die „dies tun“ NotSupportedException zu werfen. Beispiele könnten IBindingList.SupportsSearching / IBindingList.Find() etc werden.

Die meisten Entwickler bei Microsoft sind vertraut mit Design-Muster, in denen ein NotImplementedException geeignet ist. Es ist ziemlich häufig tatsächlich.

Ein gutes Beispiel ist ein Composite-Muster , wo viele Objekte können als eine einzige behandelt werden Instanz eines Objekts. Eine Komponente wird als Basis abstrakte Klasse verwendet für (richtig) geerbt Blattklassen. Zum Beispiel kann eine Datei- und Verzeichnis Klasse aus der gleichen abstrakten Basisklasse erbt, weil sie sehr ähnliche Arten sind. Auf diese Weise können sie als ein einzelnes Objekt behandelt werden (was Sinn macht, wenn man darüber nachdenkt, welche Dateien und Verzeichnisse sind - in Unix zum Beispiel, alles ist eine Datei).

So in diesem Beispiel wäre es ein GetFiles sein () -Methode für die Directory-Klasse, die File-Klasse jedoch würde diese Methode nicht implementieren, weil es keinen Sinn macht, dies zu tun. Stattdessen Sie eine NotImplementedException bekommen, weil eine Datei nicht über Kinder, wie ein Verzeichnis der Fall ist.

Beachten Sie, dass dies nicht auf .NET beschränkt ist -. Sie in vielen OO-Sprachen und Plattformen in diesem Muster kommen werden

Warum fühlen Sie die Notwendigkeit, jede mögliche Ausnahme zu fangen? Haben Sie jeden Methodenaufruf mit catch (NullReferenceException ex) wickeln auch?

Stub Code werfen NotImplementedException ist ein Platzhalter, wenn es sie es Fehler wie NullReferenceException sein sollte, lösen macht.

Ich denke, es gibt viele Gründe, warum MS NotImplementedException zum Rahmen hinzugefügt:

  • Als Bequemlichkeit; da viele Entwickler es während der Entwicklung benötigen, warum sollte jeder haben, um ihre eigene Rolle?
  • Damit Werkzeuge können auf ihre Präsenz verlassen; zum Beispiel erzeugt Visual Studio „Implement Interface“ Befehl Methode Stubs, die NotImplementedException werfen. Wenn es nicht im Rahmen wäre, wäre dies nicht möglich sein, oder zumindest ziemlich umständlich (zum Beispiel könnte es Code generieren, die nicht kompilieren, bis Sie Ihre eigene NotImplementedException hinzufügen)
  • Um eine konsistente "gängige Praxis" zu fördern

Frankodwyer denkt an NotImplementedException als potentielle Zeitbombe. Ich würde sagen, dass jeder unfertiger Code eine Zeitbombe ist, aber NotImplementedException ist viel einfacher als die Alternativen zu entwaffnen. Zum Beispiel könnten Sie Ihren Build-Server, den Quellcode für alle Verwendungen dieser Klasse scannen haben, und sie als Warnungen melden. Wenn Sie es haben wollen wirklich verbieten, könnten Sie sogar ein pre-commit Haken an Ihrer Quelle-Steuerungssystem hinzufügen, die checkin eines solchen Codes verhindert.

Sicher, wenn Sie Ihre eigene NotImplementedException rollen, können Sie es aus dem letzten Build entfernen, um sicherzustellen, dass keine Zeitbomben bleiben. Aber das funktioniert nur, wenn Sie Ihre eigene Implementierung verwenden konsequent im gesamten Team, und Sie müssen sicherstellen, dass Sie nicht vergessen, es zu entfernen, bevor Sie freigeben. Auch könnten Sie feststellen, dass Sie es nicht entfernen kann; vielleicht gibt es ein paar akzeptable Anwendungen, beispielsweise bei der Prüfung Code, der nicht an den Kunden ausgeliefert wird.

Es gibt wirklich keinen Grund, tatsächlich fangen ein NotImplementedException. Wenn getroffen, sollte es Ihre App töten, und zwar sehr schmerzlich. Der einzige Weg, um es zu beheben ist nicht durch sie zu kontrollieren, aber den Quellcode zu ändern (entweder das genannte Verfahren implementiert, oder das Ändern der Telefonvorwahl).

Zwei Gründe:

  1. Methoden werden während der Entwicklung stubbed aus, und die Ausnahme werfen die Entwickler daran zu erinnern, dass ihr Code Schreiben nicht beendet ist.

  2. Die Implementierung eine Unterklasse-Schnittstelle, die vom Design her nicht eine nicht implementiert oder mehr Methoden der vererbten Basisklasse oder Schnittstelle. (Einige Schnittstellen sind einfach zu allgemein.)

Das klingt wie ein Potential Minenfeld mir. In der fernen Vergangenheit arbeitete ich einmal auf einem Legacy-Netzwerk-System, das ohne Unterbrechung seit Jahren läuft und die fiel über einen Tag. Wenn wir das Problem aufgespürt, fanden wir einige Code, der eindeutig nicht fertig war und die hätte nie gearbeitet - buchstäblich, wie der Programmierer bei der Codierung der sie unterbrochen wurde. Es war offensichtlich, dass dieser spezielle Codepfad vor genommen nie hatte.

Murphys Gesetz sagt, dass etwas Ähnliches ist nur im Fall von NotImplementedException geschehen betteln. Zugegeben in diesen Tagen der TDD usw., sollte es vor der Freigabe abgeholt werden, und zumindest können Sie Code für diese Ausnahme vor der Freigabe grep, aber immer noch.

Bei der Prüfung ist es schwierig, Abdeckung jedem Fall zu gewährleisten, und das klingt wie es Ihre Aufgabe schwieriger macht, indem Laufzeit Probleme von dem, was der Kompilierung Probleme gewesen sein könnte. (Ich denke, eine ähnliche Art von ‚technischen Schulden‘ kommt mit Systemen, die stark auf ‚Duck Typing‘ verlassen, während ich anerkennen, sind sie sehr nützlich).

Sie müssen diese Ausnahme für COM-Interop. Es ist E_NOTIMPL . Der verlinkte Blog zeigt auch andere Gründe

Werfen NotImplementedException ist die logischste Art und Weise für die IDE zu erzeugen Stub-Code zu kompilieren. Wie, wenn Sie die Schnittstelle erweitern und Visual Studio Stummel es für Sie.

Wenn Sie haben ein bisschen von C ++ / COM, die es auch gab, außer es als E_NOTIMPL bekannt war.

Es ist ein gültiger Anwendungsfall für sie. Wenn Sie auf eine bestimmte Methode einer Schnittstelle arbeiten wollen, Sie zu kompilieren Code, so können Sie es debuggen und testen. Nach Ihrer Logik müßten Sie die Methode von der Schnittstelle entfernen und nicht-Compilierung Stubcode Kommentar aus. Dies ist ein sehr fundamentalistischen Ansatz und während es Verdienst hat, wird oder sollte nicht jeder, dass haften. Außerdem die meiste Zeit wollen Sie die Schnittstelle auf Vollständigkeit.

Mit schön ein NotImplementedException identifiziert, welche Methoden noch nicht bereit sind, am Ende des Tages so einfach es ist, als Ctrl+Shift+F drücken sie alle zu finden, ich bin auch sicher, dass statische Code-Analyse-Tools es bis holen werden.

Sie sind nicht versenden Code gemeint, die Ausnahme NotImplementedException hat. Wenn Sie denken, dass es durch den Verzicht auf Sie Ihren Code besser machen können, gehen weiter, aber es gibt produktivere Dinge, die Sie tun können, um die Quelle Qualität zu verbessern.

NotImplementedException

Die Ausnahme wird ausgelöst, wenn eine angeforderte Methode oder Operation nicht durchgeführt wird.

macht dies eine einzige Ausnahme in .NET Kern definiert macht es leichter, sie zu finden und zu beseitigen. Wenn jeder Entwickler sollten ihre eigenen ACME.EmaNymton.NotImplementedException schaffen würde es schwieriger sein, sie alle zu finden.

NotSupportedException

Die Ausnahme wird ausgelöst, wenn eine aufgerufene Methode nicht unterstützt wird.

Zum Beispiel, wenn es ein Versuch zu lesen, suchen, oder in einen Stream zu schreiben, die nicht die aufgerufenen Funktionen nicht unterstützt.

Zum Beispiel erzeugt Iteratoren (unter Verwendung von yield keyword) ist IEnumerator-a, aber die Methode löst IEnumerator.Reset NotSupportedException.

Von ECMA-335, CLI-Spezifikation, specificialy die CLI-Bibliothekstypen, System.NotImplementedException, bemerkt Abschnitt:

"Eine Reihe von Arten und Konstrukten, angegeben an anderer Stelle in diesem Standard wird nicht von CLI-Implementierungen erforderlich, die nur auf das Kernel Profil entsprechen. Zum Beispiel kann das Floating-Point-Feature-Set besteht aus dem Floating-Point-Datentypen-System .Single und System.Double. Wenn die Unterstützung für diese von einer Implementierung weggelassen wird, jeder Versuch, eine Signatur zu verweisen, die die Fließkommadatentypen führt zu einer Ausnahme des Typs System.NotImplementedException umfasst. "

So wird die Ausnahme für Implementierungen gedacht, die nur minimale Übereinstimmung Profile implementieren. Die erforderliche Mindestprofil ist die Kernel-Profil (siehe ECMA-335 4. Auflage - Partition IV, Abschnitt 3), die den BCL enthält, weshalb die Ausnahme in der „Kern-API“ enthalten ist, und nicht in einem anderen Ort <. / p>

Mit der Ausnahme stubbed Methoden zu bezeichnen, oder für Designer-Verfahren erzeugt fehlt Umsetzung ist die Absicht der Ausnahme falsch zu verstehen.

Wie, warum diese Informationen nicht für die MS in der MSDN-Dokumentation Umsetzung des CLI ist mir schleierhaft.

Ich kann nicht für NotImplementedException bürgen (wir meistens mit Ihrer Meinung zustimmen), aber ich habe NotSupportedException ausgiebig in der Core-Bibliothek haben wir bei der Arbeit verwenden. Die DatabaseController zum Beispiel können Sie eine Datenbank von jedem unterstützten Typ dann die DatabaseController Klasse ohne Pflege zu viel über die Art der Datenbank für den Rest des Codes unter Verwendung erstellen. Recht einfach Sachen, nicht wahr? Wo NotSupportedException praktisch ist (und wo ich hätte meine eigene Implementierung verwendet, wenn man nicht bereits vorhanden ist) sind im Wesentlichen zwei Instanzen:

1) Die Migration einer Anwendung zu einer anderen Datenbank Es wird oft argumentiert, dies selten, wenn überhaupt, geschieht oder benötigt wird. Bullsh * t. Holen Sie mehr.

2) Die gleiche Datenbank, verschiedene Treiber Jüngstes Beispiel dafür war, wenn ein Kunde, der eine Access-backed Anwendung von WinXP auf Win7 x64 Upgrade verwendet. Da keine 64-Bit-JET-Treiber installiert ihre IT-Mann stattdessen die AccessDatabaseEngine. Wenn unsere App abgestürzt, könnten wir leicht sehen, aus dem Protokoll wurde DB.Connect mit NotSupportedException Absturz - die wir ansprechen schnell in der Lage waren. Ein weiteres aktuelles Beispiel war einer unserer Programmierer versuchen, Transaktionen auf einer Access-Datenbank zu verwenden. Auch wenn Access-Transaktionen unterstützt, ist unsere Bibliothek nicht Zugang Transaktionen unterstützen (aus Gründen außerhalb des Geltungsbereichs dieses Artikels). NotSupportedException, es ist Ihre Zeit zu glänzen!

3) Allgemeine Funktionen Ich kann nicht glauben, von einem kurzen „aus Erfahrung“ hier Beispiel, aber wenn Sie wie eine Funktion, über etwas denken, die eine Anlage zu einer E-Mail fügt hinzu, wollen Sie es ein paar gemeinsamen Dateien wie JPEG-Dateien zu übernehmen zu können, alles von verschiedenen abgeleiteten Stream-Klassen, und so gut wie alles, was ein „.ToString“ -Methode hat. Für den letzten Teil, können Sie sicherlich nicht günstig für alle möglichen Konto, so dass Sie es generische machen. Wenn ein Benutzer OurCrazyDataTypeForContainingProprietarySpreadsheetData gibt, verwendet Reflexion auf das Vorhandensein einer ToString-Methode zu testen und NotSupportedException Rückkehr Mangel an Unterstützung, um anzuzeigen, für die Datentypen gesagt, dass nicht ToString unterstützen.

NotSupportedException ist keineswegs eine entscheidende Funktion, aber es ist etwas, das ich mich viel mehr mit finden, wie ich an größeren Projekten zu arbeiten.

Lets sagen, Sie haben diese Methode in Ihrem Produktionscode

public void DoSomething()

Welche würden Sie nehmen, wenn Sie später verlassen wollen es fertig sein?

public void DoSomething()
{
}

oder

public void DoSomething()
{
    throw new NotImplementedException();
}

Ich würde die zweite sicherlich nehmen. Gekoppelt mit Elmah oder was auch immer die Fehlerprotokollierung Mechanismus Sie haben (implementiert als ein Aspekt in Ihrer gesamten Anwendung). Zusammen mit log / Ausnahme-Filterung für critial Fehler E-Mail-Benachrichtigung ausgelöst wird, wenn man erwischt wird.

Das Argument, dass NotImplementedException == unvollendet ist entweder nicht korrekt. (1) Fangen von nicht implementierten Methoden sollten Komponententests / Integrationstests gelassen werden. Wenn Sie 100% Deckung (was sollten Sie jetzt tun, mit so vielen, vielen Mock / Stub / Codegenerierungswerkzeuge) ohne NotImplementedException, was sind Ihre Sorgen? (2) Code-Generierung. Plain einfach. Noch einmal, wenn ich den Code generieren, und nur die Hälfte des generierten Codes verwenden, warum nicht ich habe NotImplementedException im Rest des erzeugten Stub?

Es ist wie Code sagen sollte nicht kompiliert werden, es sei denn jeder Nullable-Eingang für null geprüft / gehandhabt werden soll. (AKA die Billionen-Dollar-Fehler, wenn nicht mehr). Sprache sollte flexibel sein, während Tests / Verträge sollten fest sein.

In seltenen Fällen kann ich es für Interface-Fixierung verwendet werden. Angenommen, Sie haben eine Schnittstelle, die Sie benötigen entsprechen, aber bestimmte Methode wird nie jemand genannt, so bleiben nur NotImplementedException und wenn jemand es nennt sie wissen, dass sie etwas falsch machen.

NotImplementedException wird für einige Methode von .NET geworfen (siehe den Parser C # in der Code-DOM, die nicht implementiert ist, aber die Methode existieren!) Sie können mit dieser Methode Microsoft.CSharp.CSharpCodeProvider.Parse überprüfen

Sie sind beide Hacks für zwei gemeinsame Probleme.

NotImplementedException ist eine Abhilfe für Entwickler, die Architektur Astronauten sind und wie zuerst die API aufzuschreiben, Code später. Offensichtlich, da dies kein inkrementeller Prozess ist, können Sie nicht alle auf einmal implementieren und deshalb wollen Sie behaupten, Sie sind halb getan durch NotImplementedException werfen.

NotSupportedException ist ein Hack um die Begrenzung der Typ-Systeme, wie sie in C # und Java gefunden. In diesen Systemen des Typs, sagen Sie, dass ein Rechteck ‚ist ein‘ Shape iff Rectangle alle Formen Eigenschaften erbt (inkl. Elementfunktionen + Variablen). Doch in der Praxis ist dies nicht wahr. Zum Beispiel ist ein Quadrat ein Rechteck, sondern ein Platz ist eine Einschränkung eines Rechtecks, nicht eine Verallgemeinerung.

Also, wenn Sie wollen das Verhalten der übergeordneten Klasse erben und zu beschränken, werfen Sie auf Methoden NotSupported, die für die Beschränkung nicht sinnvoll.

Was Prototypen oder unvollendeten Projekte?

Ich glaube nicht, das ist eine wirklich schlechte Idee, eine Ausnahme zu verwenden (obwohl ich ein messagebox in diesem Fall verwendet werden).

Nun, ich etwas zustimmen. Wenn eine Schnittstelle hat so gemacht, dass nicht alle Klasse alle Bits davon umsetzen können, sollte es gebrochen habe meiner Meinung nach unten.

Wenn IList kann oder nicht geändert werden kann, sollte es in zwei aufgeteilt habe, einen für den unveränderbaren Teil (Getter, Nachschlagen, etc.), und einem für die modifizierbaren Teil (Einrichter, hinzuzufügen, entfernen usw. ).

Ich habe ein paar NotImplementedExceptions in meinem Code. Oft kommt es aus einem Teil einer Schnittstelle oder eine abstrakte Klasse. Einige Methoden, die ich fühle ich mich in der Zukunft brauchen, machen sie Sinn als Teil der Klasse zu sein, aber ich will einfach nicht die Zeit nehmen, um hinzuzufügen, wenn ich es wirklich brauchen. Zum Beispiel habe ich eine Schnittstelle für alle einzelnen Arten von Statistiken in meinem Spiel. Eine dieser Arten ist eine ModStat, die die Summe der Basis stat plus alle Modifikatoren (zB Waffen, Rüstungen, Zaubersprüche). Meine Stat-Schnittstelle hat ein OnChanged Ereignis, aber meine ModStat funktioniert, indem die Summe aller Statistiken Berechnung es jedes Mal verweist sie aufgerufen wird. Anstatt also den Aufwand für eine Tonne ModStat.OnChange Ereignisse, die jedes Mal, wenn eine Stat Änderung angehoben wird, ich habe nur eine NotImplementedException geworfen, wenn jemand versucht, einen Zuhörer zu OnChange hinzufügen / entfernen.

.NET-Sprachen sind alle über die Produktivität, also warum Ihre Zeit etwas Codierung verbringen werden Sie nicht einmal benutzen?

Hier ist ein Beispiel: In Java, wenn Sie die Schnittstelle Iterator implementieren, haben Sie die offensichtlichen Methoden hasNext() und next() außer Kraft zu setzen, aber es gibt auch delete(). In 99% der usecases ich ich brauche das nicht, so werfe ich nur einen NotImplementedException. Das ist viel besser als leise nichts zu tun.

Die NotImplementedException existiert nur die Entwicklung zu erleichtern. Stellen Sie sich die Implementierung einer Schnittstelle starten. Sie möchten in der Lage sein, um zumindest zu bauen, wenn Sie eine Methode getan implementieren, bevor er zum nächsten bewegt. die NotImplemented Methoden mit NotImplementedExceptions Stubbing ist eine gute Möglichkeit, unfertigen Code des Lebens, die super einfach später zu erkennen. Sonst würden Sie das Risiko schnell Umsetzung etwas ausführen, das Sie beheben könnte vergessen.

Wenn Sie es nicht dann verwenden, einfach ignorieren. Wenn Sie einen Code-Block, dessen Erfolg haben, hängt von jedem Stück von ihm gelingt, aber es könnte zwischen scheitern, dann ist Ihre einzige Option ist die Basis Exception zu fangen und zurückrollen, was wieder werden muss gerollt. Vergessen NotImplementedException. Es könnte jede Menge Ausnahmen geworfen, wie MyRandomException und GtfoException und OmgLolException sein. Nachdem Sie ursprünglich den Code schreiben konnte ich vorbeikommen und wieder einen einzigen Ausnahme-Typ aus der API werfen Sie anrufen. Eine, die nicht existieren, wenn Sie Ihren Code geschrieben haben. Behandeln Sie die, die Sie wissen, wie für alle anderen zu handhaben und Rollback heißt catch(Exception). Es ist ziemlich einfach, ich glaube ... ich finde es auch praktisch ist. Vor allem, wenn Sie versuchen, ausgefallene Dinge mit der Sprache / Framework, das gelegentlich Dinge auf Sie erzwingen.

Ein Beispiel, das ich habe, ist die Serialisierung. Ich habe Eigenschaften in meiner .NET-Bibliothek hinzugefügt, die in der Datenbank nicht vorhanden sind (zum Beispiel bequeme Wrapper über bestehende „dumme“ Eigenschaften, wie eine FullName Eigenschaft, die FirstName kombiniert, MiddleName und LastName). Dann möchte ich diese Datentypen in XML serialisiert werden sie über den Draht zu senden (zum Beispiel von einer ASP.NET-Anwendung zu JavaScript), aber die Serialisierung Rahmen serialisiert nur öffentliche Eigenschaften mit beide get und set Accessoren. Ich will nicht, Sie in der Lage sein FullName einzustellen, weil dann würde ich es analysieren müssen und es könnte einige unvorhergesehene Format haben, das ich falsch analysieren und Datenintegrität geht aus dem Fenster. Es ist einfacher, nur die zugrundeliegenden Eigenschaften dafür zu verwenden, aber da die Sprache und API mich erfordern eine set Accessor zu haben, werde ich ein NotImplementedException werfen (ich von NotSupportedException nicht bewusst war, bis ich diesen Thread gelesen, aber entweder funktioniert) so dass, wenn einige Programmierer auf der Straße FullName gesetzt werden versuchen, wird er die Ausnahme während des Tests auftreten und seinen Fehler erkennen.

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