Konventionen für Ausnahmen oder Fehler-codes
Gestern hatte ich eine hitzige Diskussion mit einem Kollegen, was wäre die bevorzugte Methode der Fehlerberichterstattung. Vor allem wir diskutieren über die Nutzung von Ausnahmen oder Fehler-codes für die Berichterstattung Fehler zwischen Anwendungen oder-Module.
Welche Regeln Sie verwenden, um zu entscheiden, ob Sie exceptions werfen-oder return-Fehler-codes für die Fehler-Berichterstattung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In high-level-Sachen, Ausnahmen; im low-level-Sachen, Fehler-codes.
Das default-Verhalten eine Ausnahme ist, sich zu entspannen, den stack und beenden Sie das Programm, wenn ich Schreibe ein Skript ein und ich gehe nach einem Schlüssel, der nicht in einem Wörterbuch ist es wahrscheinlich ein Fehler, und ich will, das Programm zu stoppen und lassen Sie mich wissen, dass.
Wenn ich allerdings Schreibe, dass ein Stück code, das ich muss wissen das Verhalten in jeder möglichen situation, dann möchte ich Fehlercodes. Ansonsten habe ich zu wissen, dass jeder Ausnahme, die geworfen werden können, indem jede Zeile in meiner Funktion zu wissen, was es tun wird (Lesen Die Ausnahme, die Geerdet einer Fluggesellschaft um eine Idee zu bekommen, wie schwierig das ist). Es ist mühsam und hart code zu schreiben, der reagiert angemessen auf jede situation (einschließlich die unglücklichen), aber das ist, weil das schreiben fehlerfreier code ist mühsam und hart, nicht, weil Sie vorbei sind Fehler-codes.
Beide Raymond Chen und Joel haben einige beredte Argumente gegen die Verwendung von Ausnahmen für alles.
nodiscard
- Attribut zu geben, der eine compiler-Warnung, wenn der Rückgabewert einer Funktion wird nicht gespeichert. Hilft ein wenig zu fangen, vergessen Fehler-code-Kontrolle. Beispiel: godbolt.org/g/6i6E0BMag ich eigentlich eher Ausnahmen, weil Sie mehr kontextbezogene Informationen und vermitteln können (wenn richtig verwendet) die Fehlermeldung für den Programmierer übersichtlicher Weise.
Auf der anderen Seite, Fehler-codes sind leichter als Ausnahmen, sind aber schwieriger zu pflegen. Die Fehlerprüfung kann versehentlich weggelassen werden. Fehlercodes sind schwieriger zu pflegen, weil Sie haben, um einen Katalog mit allen Fehlercodes und schalten Sie das Ergebnis, um zu sehen, was der Fehler ausgelöst wurde. Fehler-Bereiche können hier helfen, denn wenn das einzige, was uns interessiert, ist, wenn wir in der Gegenwart einen Fehler oder nicht, es ist einfacher zu überprüfen (z.B. ein HRESULT-Fehler-code von größer oder gleich 0 ist Erfolg und weniger als null Fehler). Sie können versehentlich weggelassen, weil es keine programmatischen erzwingen, dass der Entwickler prüfen, ob Fehler-codes. Auf der anderen Seite, Sie können nicht ignorieren, Ausnahmen.
Zusammenzufassen, die ich bevorzuge Ausnahmen über Fehler-codes in fast allen Situationen.
Bevorzuge ich Ausnahmen, weil
goto
Fehler-codes ignoriert werden kann (und oft!) durch die Anrufer von Ihren Funktionen. Ausnahmen zumindest zwingen befassen sich mit der Fehler in irgendeiner Weise. Auch wenn Ihre version von Umgang mit ihm ist ein leerer catch-handler (seufz).
Ausnahmen über Fehlercodes, kein Zweifel. Sie erhalten die gleichen Vorteile von Ausnahmen, wie Sie mit Fehler-codes, aber auch viel mehr, ohne die Mängel der Fehler-codes. Die einzige klopfen an Ausnahmen ist, dass es etwas mehr Aufwand, aber in diesem Tag und Alter, das overhead sollte als vernachlässigbar angesehen werden für fast alle Anwendungen.
Hier sind einige Artikel diskutieren, den Vergleich und die Gegenüberstellung der beiden Techniken:
Gibt es einige gute links in denen, die Sie geben können, weiter zu Lesen.
Ich würde nie mischen die beiden Modelle...es ist zu schwer zu konvertieren von einem zum anderen wie Sie sich bewegen, von einem Teil des Stapels, die Verwendung von error-codes, um eine höhere Stück mit Ausnahmen.
Ausnahmen sind für "alles, was nicht mehr oder hemmt die Methode oder Unterroutine von tun, was Sie gebeten, es zu tun" ... NICHT zu versäumen, die Mitteilungen über Unregelmäßigkeiten oder ungewöhnliche Umstände oder der Zustand des Systems, etc. Return-Werte oder ref (oder out -) Parameter für das.
Ausnahmen zulassen Methoden geschrieben werden (und verwertet), mit der Semantik, die abhängig von der Methode-Funktion, d.h. eine Methode liefert, dass ein Mitarbeiter-Objekt oder eine Liste der Mitarbeiter eingegeben werden kann, genau das zu tun, und Sie können es nutzen, indem Sie.
Mit Fehlercodes, alle Methoden liefern einen Fehlercode zurück, so, für diejenigen, die brauchen, um wieder etwas anderes verwendet werden, indem der Aufruf-code, die Sie haben, um einen Referenz-variable bevölkert werden, die Daten und testen Sie die return-Wert den Fehler-code, und Griff es auf jede Funktion oder Methode aufrufen.
Wenn Sie den code so, dass jeder Methode eine und nur eine einfache Sache, dann sollten Sie eine Ausnahme werfen, wenn die Methode nicht erreichen können, die Methode das gewünschte Ziel. Ausnahmen sind sehr viel vielseitiger und einfacher zu verwenden, auf diese Weise als Fehler-codes. Dein code ist viel sauberer - Der standard flow der "normale" code-Pfad gewidmet werden kann streng der Fall, wenn die Methode in der Lage IST, das zu erreichen, was Sie wollte, es zu tun... Und dann den code zu bereinigen, oder Sie behandeln das "außergewöhnliche" Umstände, wenn etwas schlimmes passiert, das verhindert, dass die Methode nicht erfolgreich abgeschlossen werden kann isolierte abseits der normalen code. Darüber hinaus, wenn Sie nicht mit den Ausnahmen, wo es aufgetreten ist, und muss es passieren in den stack ein UI (oder noch schlimmer, über den Draht von einem mid-tier-Komponente einer Benutzeroberfläche), dann mit dem Ausnahme-Modell, brauchen Sie nicht, um code jedes eingreifenden Methode in Ihren stack zu erkennen, und übergeben Sie die Ausnahme in den stack... Der Ausnahme-Modell tut dies für Sie automatisch.... Mit der Fehler-codes, dieses Stück des Puzzles bekommen können belastend sind, sehr schnell.
Ich In der Vergangenheit trat der Fehlercode Lager (hab zu viel C-Programmierung). Aber jetzt habe ich das Licht gesehen.
Ja Ausnahmen, die sind ein bisschen eine Belastung auf das system. Aber Sie vereinfachen den code, die Verringerung der Anzahl der Fehler (und WTF-s).
Nutzen Sie also die Ausnahme, aber benutzen Sie Sie klug. Und Sie wird dein Freund sein.
Als eine Randnotiz. Ich habe gelernt, zu dokumentieren, Wann welche exception geworfen werden kann, durch die Methode. Leider ist dies nicht erforderlich, die von den meisten Sprachen. Aber es erhöht die chance, Handhabung des rechts, die Ausnahmen auf dem richtigen Niveau.
Gibt es vielleicht ein paar Situationen, in denen mit Ausnahmen in einem sauberen, klaren, richtigen Weg ist umständlich, aber die überwiegende Mehrheit der Zeit, die Ausnahmen sind die offensichtliche Wahl. Der größte Vorteil der Ausnahmebehandlung über Fehler-codes ist, dass es ändert sich der Ablauf der Ausführung, die ist aus zwei Gründen wichtig.
Wenn eine Ausnahme Auftritt, wird die Anwendung nicht mehr verfolgt, es ist 'normal' - Ausführung Weg. Der erste Grund, warum dies so wichtig ist, dass es sei denn, der Autor der code geht gut und wirklich aus dem Weg, schlecht zu sein, das Programm zu stoppen und nicht weiter zu tun unvorhersehbare Dinge. Wenn ein Fehler-code nicht erhalten, überprüft und geeignete Maßnahmen nicht ergriffen, die in Reaktion auf eine schlechte Fehler-code, das Programm tut, was es tut, und wer weiß, was das Ergebnis dieser Aktion sein wird. Es gibt viele Situationen, wo mit den Programm zu tun, 'was immer' könnte wind-up sehr teuer. Betrachten wir ein Programm, das zum abrufen von Leistungsdaten für die verschiedenen Finanzinstrumente, die ein Unternehmen verkauft, und liefert diese Informationen an Makler/Großhändler. Wenn etwas schief geht und das Programm in Gang hält, könnte es Schiff fehlerhafte performance-Daten an den Makler und an den Großhandel. Ich don T wissen über jemand anderes, aber ich will nicht derjenige sein, der sitzt in einem VPs-office erklären, warum mein code verursacht das Unternehmen zu erhalten, 7-Figuren im Wert von Ordnungsstrafen. Liefert eine Fehlermeldung für die Kunden ist in der Regel vorzuziehen liefert falsche Daten, Aussehen könnte, um für 'echt', und die letztere situation ist viel leichter zu führen mit einer viel weniger aggressiven Ansatz wie Fehler-codes.
Der zweite Grund, warum ich gerne Ausnahmen und deren Bruch der normalen Ausführung ist, dass es macht es viel, viel einfacher zu halten die "normalen Dinge sind passiert" Logik getrennt von der 'etwas ging schief Logik'. Für mich:
...ist besser so:
Gibt es andere kleine Dinge, über Ausnahmen, die sind schön, wie gut. Mit einem Bündel von bedingten Logik, um zu verfolgen, ob eine der Methoden aufgerufen wird, in eine Funktion hatte einen Fehler-code zurück, und zurück, die Fehler-code weiter oben wird eine Menge von boiler plate. In der Tat, es ist eine Menge von Kessel Platte, die schief gehen können. Ich habe viel mehr Vertrauen in die Ausnahme-system der meisten Sprachen als ich ein Ratten nest von if-else-if-else-Anweisungen, die 'Frisch-aus-dem-college' Fred schrieb, und ich habe viel bessere Dinge mit meiner Zeit zu tun als die code-überprüfung, sagte Ratte ' s nest.
Sie sollte sowohl. Die Sache ist zu entscheiden, Wann die Verwendung jedes.
Gibt es eine wenige Fälle, in denen Ausnahmen sind die offensichtliche Wahl,:
In einigen Situationen Sie können nichts mit dem Fehler-code, und Sie nur behandeln müssen, dass es in einer oberen Ebene in der Aufrufliste, in der Regel melden Sie den Fehler, etwas angezeigt, um den Benutzer oder das Programm schließen. In diesen Fällen, Fehler-codes erfordern würde, Sie zu Blasen-bis die Fehler-codes manuell level um level, das ist natürlich viel einfacher zu tun, mit Ausnahmen. Der Punkt ist, dass dies für unerwartete und unhandleable Situationen.
Doch über die situation 1 (wo etwas unerwartetes und unhandleable passiert, nur wan nicht anmelden, es), Ausnahmen können hilfreich sein, weil Sie vielleicht hinzufügen von Kontextinformationen. Zum Beispiel, wenn ich eine SqlException in meinem unteren Ebene Daten Helfer, ich werde mich fangen wollen, dass Fehler in der low-level (wo ich weiß, der SQL-Befehl, der den Fehler verursacht hat), so kann ich erfassen, dass die Informationen und rethrow mit zusätzlichen Informationen. Bitte beachten Sie hier das Zauberwort: rethrow, und nicht schlucken.
Die erste Regel für die Ausnahmebehandlung: nicht schlucken Ausnahmen. Beachten Sie auch, dass meine innere fangen nicht erst anmelden müssen, nichts, weil die äußeren catch wird der ganze stack-trace und melden Sie es.
In einigen Situationen müssen Sie eine Folge von Befehlen, und , wenn einer von Ihnen ausfallen sollten Sie Aufräumen/entsorgen Ressourcen(*), ob oder nicht, dies ist ein nicht behebbarer situation (die geworfen werden sollte) oder eine korrigierbare situation (in dem Fall, dass Sie behandeln können, die lokal oder in der Aufrufer-code, aber Sie brauchen nicht die Ausnahmen). Offensichtlich ist es viel einfacher, um alle diese Befehle in einer einzigen versuchen, statt der Prüfung Fehler-codes nach jeder Methode und Aufräumen/entsorgen im finally-block. Bitte beachten Sie, dass wenn Sie möchten, den Fehler zu sprudeln (das ist wahrscheinlich das, was Sie wollen), brauchen Sie nicht einmal brauchen, um es zu fangen - verwenden Sie einfach die schließlich für Aufräumen/entsorgen - sollten Sie nur verwenden, fangen/retrow wenn Sie möchten, fügen Sie Kontext-Informationen (siehe Punkt 2).
Ein Beispiel wäre eine Folge von SQL-Anweisungen innerhalb einer Transaktion ausgeführt werden. Wieder, das auch ein "unhandleable" - situation, auch wenn Sie sich entscheiden, es zu fangen früh (Behandlung von lokal statt sprudelt bis an die Spitze) es ist immer noch ein fatale situation, von wo das beste Ergebnis ist abgebrochen, alles oder zumindest den Abbruch eines großen Teils des Prozesses.
(*) Dies ist, wie die
on error goto
dass wir in alten Visual Basic -In Konstruktoren kann man nur exceptions werfen.
Gesagt haben, dass, in allen anderen Situationen, bei denen Sie Rückkehr einige Informationen über die der Anrufer KANN/SOLLTE man einige Maßnahmen ergreifen, mit return-codes ist wahrscheinlich eine bessere alternative. Dies umfasst alle erwartet "Fehler", weil wahrscheinlich Sie sollten behandelt werden, indem Sie den unmittelbaren Aufrufer, und kaum werden müssen, sprudelte Sie zu viele Ebenen in dem Stapel.
Natürlich ist es immer möglich, zu behandeln erwartete Fehler als Ausnahmen, und fangen dann sofort eine Ebene nach oben, und es ist auch möglich, umfassen jede Zeile code in einem try-catch-und nehmen die Aktionen für die einzelnen möglichen Fehler. IMO, das ist schlechtes design, nicht nur, weil es viel Ausführlicher ist, aber speziell, weil die möglichen Ausnahmen, die vielleicht geworfen werden, sind offensichtlich nicht Lesen, ohne die Quellcode - und die Ausnahmen, die geworfen werden konnte, aus jeder Tiefe Methode, die Schaffung invisible gotos. Sie brechen die Struktur des Codes, indem Sie mehrere unsichtbare exit-Punkte, die den code schwer zu Lesen und zu prüfen. In anderen Worten, Sie sollten nie Ausnahmen wie flow-control, denn das wäre schwer für andere zu verstehen und zu pflegen. Es kann sogar schwierig, zu verstehen, alle möglichen code-flows für die Prüfung.
Wieder: für richtig Aufräumen/entsorgen, die Sie verwenden können, versuchen Sie es-endlich ohne Fang nichts.
Den beliebtesten Kritik über return-codes ist, dass "jemand könnte, ignorieren Sie die Fehler-codes, aber in demselben Sinne kann jemand auch schlucken Ausnahmen. Bad exception handling ist einfach in beiden Methoden. Aber das schreiben von Fehler-code-basierte Programm ist immer noch viel einfacher als das schreiben einer Ausnahme-Programm. Und wenn man aus irgendeinem Grund beschließt, Sie zu ignorieren Sie alle Fehler (auch die alte
on error resume next
), können Sie ganz einfach tun, dass mit der return-codes, und Sie können nicht tun, ohne eine Menge von try-catchs boilerplate.Die zweite beliebtesten Kritik über return-codes ist, dass "es ist schwierig, bubble up" - aber das ist, weil die Menschen nicht verstehen, die Ausnahmen sind für nicht behebbare Situationen, während die Fehler-codes nicht.
Entscheidung zwischen Ausnahmen und Fehler-codes ist eine Grauzone. Es ist sogar möglich, dass Sie brauchen, um ein Fehler code aus einer wiederverwendbaren business-Methode, und dann entscheiden Sie, zu wickeln, die in eine Ausnahme (evtl. mit Zusatz-Informationen) und lass es sprudeln. Aber es ist ein design-Fehler, anzunehmen, dass ALLE Fehler geworfen werden sollte, als Ausnahmen.
Um es zusammenzufassen:
Benutze ich gerne Ausnahmen, wenn ich eine unerwartete situation, in der es nicht viel zu tun, und wir in der Regel Abbrechen möchten, einen großen block von code oder sogar den ganzen Betrieb oder Programm. Dies ist, wie die alten "on error goto".
Ich mag die return-codes, als ich erwartet habe, Situationen, in denen der Aufrufer-code kann/sollte man einige Maßnahmen ergreifen. Dies umfasst die meisten business-Methoden, APIs, Validierungen, und so weiter.
Dieser Unterschied zwischen Ausnahmen und Fehler-codes ist eines der design-Prinzipien der Sprache, die verwendet "Panik" für schwerwiegende unerwartete Situationen, während normale Situationen erwartet werden als Fehler zurückgegeben.
Doch zu GEHEN, ermöglicht es auch,mehrere Rückgabewerte , das ist etwas, das hilft, eine Menge über die Verwendung von return-codes, da kann man gleichzeitig einen Fehler zurück, und etwas anderes. Auf C#/Java was wir erreichen können, dass mit out-Parameter, Tupel, oder (mein Favorit) Generika, die in Kombination mit enums lassen sich klare Fehler-codes an den Anrufer:
Wenn ich einen neuen hinzufügen möglich zurück in meine Methode, ich kann sogar überprüfen Sie alle Anrufer, wenn Sie decken, die den neuen Wert in einer switch-Anweisung zum Beispiel. Kann man wirklich nicht tun, mit Ausnahmen. Wenn Sie die return-codes, werden Sie in der Regel im Voraus wissen, alle möglichen Fehler, und testen Sie für Sie. Mit Ausnahmen, die Sie in der Regel nicht wissen, was passieren könnte. Verpackung Enumerationen, die im inneren Ausnahmen (statt Generika) ist eine alternative (vorausgesetzt, es ist klar, die Art von Ausnahmen, die jede Methode wirft), aber IMO ist es immer noch schlechtes design.
Kann ich sitzen auf dem Zaun hier, aber...
In Python, die Verwendung von Ausnahmen ist gängige Praxis, und ich bin ganz glücklich, um zu definieren, meine eigenen Ausnahmen. In C Sie don ' T haben, die Ausnahmen auf alle.
In C++ (in der STL-mindestens), Ausnahmen sind normalerweise nur ausgelöst, für wirklich außergewöhnliche Fehler (die ich praktisch nie sehen Sie selbst). Ich sehe keinen Grund, irgendetwas anderes zu tun in meinem eigenen code. Ja, es ist einfach zu ignorieren, die Werte zurückgeben, aber C++ nicht zwingen, Sie zu fangen, Ausnahmen. Ich denke du hast einfach zu bekommen in die Gewohnheit, es zu tun.
Die code-Basis ich arbeite, ist meist C++ und wir nutzen Fehler-codes fast überall, aber es gibt ein Modul, das wirft exceptions für Fehler, einschließlich der sehr ausnahmslos, und den code, der verwendet, das Modul ist ziemlich schrecklich. Aber das könnte nur sein, weil wir haben gemischte Ausnahmen und Fehler-codes. Der code, der nutzt konsequent Fehlercodes ist viel einfacher, mit zu arbeiten. Wenn unser code konsistent verwendet Ausnahmen, vielleicht wäre es nicht so schlimm. Das mischen der beiden scheint nicht so gut funktionieren.
Da ich die Arbeit mit C++, und haben RAII, um Sie sicher zu verwenden, ich benutze Ausnahmen fast ausschließlich. Es zieht die Fehlerbehandlung aus dem normalen Programmfluss und macht die Absicht deutlich.
Ich tun, lassen Sie Ausnahmen für außergewöhnliche Umstände obwohl. Wenn ich erwarte, dass ein bestimmter Fehler passieren eine Menge, die ich werde überprüfen, dass die operation erfolgreich sein wird, vor der Durchführung, oder rufen Sie eine version der Funktion verwendet Fehler-codes statt (Wie
TryParse()
)Signaturen sollten, um Ihnen zu kommunizieren, was die Methode macht. So etwas wie
lange errorCode = getErrorCode();
könnte gut sein, doch
lange errorCode = fetchRecord();
verwirrend ist.
Meine überlegung wäre, wenn Sie schreiben von einem low-level-Treiber, die wirklich Leistung braucht, dann error-codes verwendet werden. Aber wenn Sie, diesen code in eine übergeordnete Anwendung, und es kann mit ein wenig Aufwand, dann wickeln Sie diesen code mit einer Schnittstelle, die überprüft, Fehlercodes und wirft Ausnahmen.
In allen anderen Fällen, Ausnahmen sind wahrscheinlich der Weg zu gehen.
Mein Ansatz ist, dass wir beide verwenden, also Ausnahmen und Fehler-codes bei der gleichen Zeit.
Bin ich verwendet, um zu definieren mehrere Typen von Ausnahmen (ex: DataValidationException oder ProcessInterruptExcepion) und im inneren jede Ausnahme definieren Sie eine detaillierte Beschreibung der einzelnen Probleme.
Ein Einfaches Beispiel in Java:
In dieser Art, wie ich mit Ausnahmen zu definieren, die Kategorie Fehler, und Fehler-codes zu definieren-detaillierte info über das problem.
throw new DataValidationException("The input is too small")
? Einer der Vorteile von Ausnahmen ist, so dass für detaillierte Informationen.Ausnahmen sind für außergewöhnliche Umständen - sprich, wenn Sie nicht Teil des normalen Fluss des code.
Es ist durchaus legitim zu mischen, Ausnahmen und Fehler-codes, wo der Fehler-codes repräsentieren den status von etwas, sondern als Fehler in der Ausführung des Codes per se (z.B. die überprüfung der return-code von einem Kind-Prozeß).
Aber, wenn ein außergewöhnlicher Umstand tritt glaube ich, Ausnahmen sind die ausdrucksstarken Modell.
Gibt es Fälle, in denen Sie lieber, oder haben, um Fehler-codes an Stelle von Ausnahmen, und diese wurden adäquat abgedeckt werden bereits bei (weitere als die anderen offensichtlichen Einschränkungen wie compiler-Unterstützung).
Aber geht in die andere Richtung, mithilfe von Ausnahmen können Sie bauen, auch höhere level-Abstraktionen für die Fehlerbehandlung, die machen den code noch ausdrucksstärker und natürlicher. Ich würde empfehlen, das Lesen dieses hervorragenden, aber unterschätzt, Artikel von C++ - Experte Andrei Alexandrescu auf das Thema, was er fordert, "Vollstreckungen": http://www.ddj.com/cpp/184403864. Obwohl es ein C++ - Artikel die Grundsätze, die allgemeingültig sind, und ich habe übersetzt die Vollstreckungen Konzept von C# Recht erfolgreich.
Erstens, ich Stimme mit Toms Antwort, dass für high-level-Zeug Ausnahmen, und für low-level-stuff error-codes verwendet werden, solange es keine Service-Orientierte Architektur (SOA).
In SOA, wo Methoden aufgerufen werden können, auf verschiedenen Computern, Ausnahmen können nicht über das Netzwerk übergeben, stattdessen nutzen wir Erfolg/Misserfolg Antworten mit einer Struktur wie unter (C#):
Und verwenden, wie diese:
Werden, wenn diese konsequent in Ihren Dienst Reaktionen, die es schafft, ein sehr schönes Muster, Umgang mit Erfolg/Fehler in der Anwendung. Dies ermöglicht eine einfachere Fehlerbehandlung im asynchronen Aufrufe innerhalb von services als auch über Dienstleistungen.
Ich würde es vorziehen, die Ausnahmen für alle Fehlerfälle, außer wenn ein Fehler ist eine zu erwartende bug-frei Ergebnis einer Funktion zurückgibt, die einen primitiven Datentyp. E. g. Suche nach dem index eines Teilstrings in einem größeren string würde in der Regel zurück, -1 wenn nicht gefunden, anstatt eine NotFoundException.
Rückgabe Ungültiger Zeiger, die möglicherweise aufgelöst werden (z.B. verursacht NullPointerException in Java) ist nicht akzeptabel.
Verwenden mehrere verschiedene numerische Fehlercodes (-1, -2) als return-Werte für die gleiche Funktion ist in der Regel schlechter Stil, wie Kunden möglicherweise ein "== -1" prüfen statt "< 0".
Eine Sache zu beachten hier ist die Entwicklung von APIs über die Zeit. Eine gute API erlaubt das ändern und erweitern Misserfolg Verhalten in mehreren Arten, ohne brechen Kunden. E. g. wenn ein client-Fehler-handle geprüft, für 4-Fehler-Fällen, und fügen Sie eine fünfte Fehler, den Wert Ihrer Funktion, der client-handler kann nicht testen Sie diese und brechen. Wenn Sie erhöhen, Ausnahmen, dies wird in der Regel machen es einfacher für die Kunden zur Migration auf eine neuere version einer Bibliothek.
Andere Sache zu prüfen ist, wenn in einem team arbeiten, zu zeichnen, wo eine klare Linie für alldevelopers, um eine solche Entscheidung treffen. E. g. "Ausnahmen für high-level" - Sachen, die Fehlercodes für das low-level-Zeug" ist sehr subjektiv.
In jedem Fall, in dem mehr als eine triviale Art des Fehlers möglich ist, ist der source-code sollte nie verwenden Sie das numerische literal liefern einen Fehlercode zurück oder übernehmen es (return -7, wenn x == -7,...), aber immer eine benannte Konstante (return NO_SUCH_FOO, wenn x == NO_SUCH_FOO) .
Wenn Sie arbeiten unter großen Projekt, Sie können nicht nur Ausnahmen oder nur Fehlercodes. In verschiedenen Fällen sollten Sie verwenden unterschiedliche Ansätze.
Zum Beispiel, Sie entscheiden, zu verwenden, Ausnahmen sind nur. Aber wenn Sie sich entscheiden, zu verwenden der asynchronen event-Verarbeitung. Es ist schlechte Idee, Ausnahmen für die Fehlerbehandlung in diesen Situationen. Aber anhand der Fehlercodes überall in der Anwendung mühsam.
Also meiner Meinung nach, dass es normal ist, beide zu verwenden Ausnahmen und Fehler-codes gleichzeitig.
Für die meisten Anwendungen, Ausnahmen sind besser. Die Ausnahme ist, wenn die software mit anderen Geräten kommunizieren. Die Domäne, in der ich arbeite, Steuerungen in der Industrie. Hier die Fehler codes werden bevorzugt und erwartet. Also meine Antwort ist, dass es abhängig von der situation.
Ich denke, es hängt auch davon ab, ob Sie wirklich brauchen, Informationen wie stack-trace von dem Ergebnis. Wenn ja, sind Sie definitiv gehen für die Ausnahme, die Objekt voll mit viel information über das problem. Allerdings, wenn Sie interessiert sind in Ergebnis und kümmern sich nicht, warum das Ergebnis dann gehen Sie für den Fehlercode.
z.B. Bei der Bearbeitung von Datei und Gesicht IOException, client möglicherweise daran interessiert zu wissen, von wo dieser ausgelöst wurde, wird bei öffnen der Datei oder Parsen der Datei etc. Also besser, Sie wieder IOException oder seine spezifische Unterklasse. Jedoch Szenario wie haben Sie die login-Methode, und Sie wollen wissen, es erfolgreich oder nicht war, gibt Sie nur zurück, boolean oder " richtig-Meldung anzeigen, return Fehler-code. Hier Kunde ist nicht daran interessiert, zu wissen, welcher Teil der Logik verursacht den Fehler-code. Er weiß nur, wenn Ihre Anmeldeinformationen ungültig oder der account sperren etc.
Einen anderen Anwendungsfall, das ich denken kann ist, wenn Daten Reisen auf dem Netz. Ihre remote-Methode zurückgeben kann, nur Fehler-code anstelle der Ausnahme Datentransfer zu minimieren.
Meine Allgemeine Regel ist:
Fehler-codes auch nicht funktionieren, wenn deine Methode gibt nichts anderes als ein numerischer Wert...