Der beste Weg, um Fehlercodes / Strings in Java zu definieren?
Schreibe ich ein web service in Java, und ich bin versuchen, herauszufinden, der beste Weg, um zu definieren, Fehler-codes und die zugehörigen Fehlermeldungen. Ich muss einen numerischen Fehlercode und eine Fehlermeldung string zusammengefasst. Sowohl der Fehler-code und Fehler-string an den client-Zugriff auf den web service. Zum Beispiel, wenn eine SQLException Auftritt, möchte ich vielleicht Folgendes tun:
//Example: errorCode = 1,
// errorString = "There was a problem accessing the database."
throw new SomeWebServiceException(errorCode, errorString);
Client-Programm möglicherweise mit der Meldung:
"Fehler #1 ist aufgetreten: Es war ein
problem beim Zugriff auf die Datenbank."
War mein Erster Gedanke, verwendet eine Enum
des Fehler-codes und überschreiben Sie die toString
Methoden, um wieder den Fehler Saiten. Hier ist, was ich kam mit:
public enum Errors {
DATABASE {
@Override
public String toString() {
return "A database error has occured.";
}
},
DUPLICATE_USER {
@Override
public String toString() {
return "This user already exists.";
}
},
//more errors follow
}
Meine Frage ist: gibt es einen besseren Weg, dies zu tun? Ich würde lieber eine Lösung im code, sondern als das Lesen aus einer externen Datei. Ich bin mit Javadoc für dieses Projekt, und Sie können zur Dokumentation der Fehler-codes, in-line, und haben Sie Sie automatisch aktualisieren in der Dokumentation wäre hilfreich.
InformationsquelleAutor der Frage William Brendel | 2009-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nun, es gibt sicherlich eine bessere Umsetzung der enum-Lösung (die ist im Allgemeinen ganz nett):
Möchten Sie vielleicht, um überschreiben von toString() einfach nur wieder die Beschreibung statt - nicht sicher. Trotzdem, der wichtigste Punkt ist, dass Sie nicht außer Kraft setzen müssen separat für jeden Fehlercode. Beachten Sie auch, dass habe ich explizit angegeben wird der code statt der Verwendung der ordinalen Wert - das macht es einfacher, um die Reihenfolge zu ändern und hinzufügen/entfernen von Fehlern später.
Vergessen Sie nicht, dass dies nicht internationalisiert, aber es sei denn, Ihre web-service-client sendet Sie ein Gebietsschema Beschreibung, können Sie nicht ohne weiteres internationalisieren es sich sowieso. Zumindest haben Sie den Fehler-code zu verwenden für i18n auf der client-Seite...
InformationsquelleAutor der Antwort Jon Skeet
Soweit ich bin besorgt, ich bevorzuge es, zu externalisieren, die Fehlermeldungen in eine properties-Dateien.
Dies wird sehr hilfreich sein bei der Internationalisierung Ihrer Anwendung (eine Datei pro Sprache). Es ist auch einfacher zu Bearbeiten, eine Fehlermeldung angezeigt, und es brauchen keine re-Kompilierung der Java-Quellen.
Meine Projekte, in der Regel habe ich eine Schnittstelle, die enthält Fehler-codes (String oder integer, es kümmert sich nicht viel), die den Schlüssel enthält, die in den properties-Dateien für diesen Fehler:
in der properties-Datei:
Anderes problem mit deiner Lösung ist die maintenability: du hast nur 2 Fehler, und schon 12 Zeilen code.
So stellen Sie sich Ihre Aufzählung-Datei, wenn Sie haben Hunderte von Fehlern zu verwalten!
InformationsquelleAutor der Antwort romaintaz
Überladen von toString() scheint ein bisschen eklig -- das scheint ein bisschen weit hergeholt von toString()'s normal verwenden.
Was:
scheint viel sauberer zu mir... und weniger ausführlich.
InformationsquelleAutor der Antwort Cowan
Bei meinem letzten job ging ich ein wenig tiefer in die enum-version:
@Error, @Info, @Warnung verbleiben in der Klasse Datei und sind zur Laufzeit verfügbar. (Wir hatten auch ein paar andere Anmerkungen zu beschreiben Nachrichtenübermittlung)
@Text ist eine compile-Zeit-annotation.
Schrieb ich eine annotation-Prozessor, der Folgendes gemacht:
Schrieb ich vor ein paar utility-Routinen, die dazu beigetragen log-Fehler, wickeln Sie Sie als Ausnahmen (wenn gewünscht) und so weiter.
Ich versuche, Sie zu bekommen, lassen mich open-source -...
-- Scott
InformationsquelleAutor der Antwort Scott Stanchfield
Ich würde empfehlen, dass Sie werfen Sie einen Blick auf java.util.ResourceBundle. Die Sie kümmern sollte, I18N, aber es lohnt sich, auch wenn Sie nicht. Die Auslagerung der Nachrichten ist eine sehr gute Idee. Ich habe festgestellt, dass es war nützlich, um der Lage sein, um eine Tabellenkalkulation, business-Leute, die erlaubt Ihnen, in der genauen Sprache, die Sie sehen wollte. Wir schrieb einen Ant-task zu generieren .properties-Dateien bei der Kompilierung. Es macht I18N trivial.
Wenn man auch ein Frühjahr, das so viel besser. Ihre MessageSource-Klasse ist hilfreich für diese Art von Dingen.
InformationsquelleAutor der Antwort duffymo
Nur zu halten, Auspeitschen diese Besondere tote Pferde - wir hatten gute Verwendung von numerische Fehlercodeswenn Fehler angezeigt werden, um end-Kunden, da Sie Häufig vergessen oder falsch verstanden die eigentliche Fehlermeldung kann aber manchmal behalten und berichten einen numerischen Wert, können Sie einen Anhaltspunkt geben, was tatsächlich passiert ist.
InformationsquelleAutor der Antwort telcopro
Ich (und der rest des Teams in meinem Unternehmen) bevorzugen, zu erhöhen, Ausnahmen anstelle der Rückgabe von Fehlercodes. Fehler-codes überprüft wird überall herumgereicht, und neigen dazu, um den code unlesbar, wenn die Menge von Codes größer wird.
Die error-Klasse würde bestimmen Sie dann die Nachricht.
PS: und eigentlich auch Fürsorge für die Internationalisierung !
PPS: man könnte auch definieren Sie die raise-Methode, und fügen Sie die Protokollierung, Filterung etc. falls erforderlich (bei leastin Umgebungen, wo die Exception-Klassen und-Freunde sind erweiterbar/veränderbar)
InformationsquelleAutor der Antwort blabla999
Ist ein wenig spät aber, ich war gerade auf der Suche nach einer hübschen Lösung für mich. Wenn Sie verschiedene Art von Fehler, die Sie hinzufügen können einfache, benutzerdefinierte Nachricht, die Fabrik, so dass Sie angeben können, mehr details und format, das Sie möchten später.
BEARBEITEN:
ok, mit enum-hier ist ein wenig gefährlich, da Sie alter, insbesondere enum-dauerhaft.
Ich denke, besser wäre ein Wechsel in die Klasse und die Verwendung von statischen Feldern, aber als Sie nicht verwenden können, '= = ' mehr. Also ich denke, es ist ein gutes Beispiel dafür, was nicht zu tun (oder tun Sie es nur während der Initialisierung) 🙂
InformationsquelleAutor der Antwort pprzemek
Es gibt viele Möglichkeiten, um dieses Problem zu lösen. Meine bevorzugte Ansatz besteht darin, Schnittstellen:
Nun können Sie definieren eine beliebige Anzahl von enums, die Nachrichten:
Nun haben Sie mehrere Möglichkeiten, diese wiederum in Strings um. Kompilieren Sie die strings in den code (mit Anmerkungen oder enum Konstruktor-Parameter) oder Lesen Sie aus einer config - /property-Datei oder aus einer Datenbank-Tabelle oder eine Mischung. Letzteres ist meine bevorzugte Methode, da Sie immer müssen einige Nachrichten, die Sie wiederum in den text sehr frühen (ie. während Sie eine Verbindung zu der Datenbank oder Lesen der config).
Bin ich mit unit-tests und Reflexion frameworks zu finden, alle Typen, die Implementierung meines interfaces, um sicherzustellen, dass jeder code wird verwendet, irgendwo, und dass die config-Dateien enthalten alle erwarteten Nachrichten, etc.
Frameworks verwenden, können parse Java wie https://github.com/javaparser/javaparser oder der von Eclipsekönnen Sie selbst überprüfen, wo sich die enums verwendet werden und finden, die unbenutzt sind.
InformationsquelleAutor der Antwort Aaron Digulla
enum für Fehlercode/Nachricht definition ist immer noch eine schöne Lösung aber es ist eine i18n betrifft. Tatsächlich können wir zwei Situationen: der code/Meldung wird angezeigt, die der Endanwender oder der Systemintegrator. Für den späteren Fall, I18N ist nicht notwendig. Ich denke, die web-services-ist wahrscheinlich letzteres der Fall.
InformationsquelleAutor der Antwort Jimmy
Mit
interface
als message-Konstanten ist generell eine schlechte Idee. Es wird Leck in client-Programm dauerhaft als Teil der exportierten API. Wer weiß, dass späteren client-Programmierer vielleicht analysieren, dass die Fehlermeldungen nicht(öffentlich) als Teil Ihres Programms.Werden Sie für immer gesperrt wird, dies zu unterstützen, wie Veränderungen in der format-string wird/kann brechen-client-Programm.
InformationsquelleAutor der Antwort Awan Biru
Bitte befolgen Sie die unten Beispiel:
};
In deinem code nennen mag:
InformationsquelleAutor der Antwort Chinmoy