2016-10-25 26 views
1

Ich habe versucht, Ausnahmen mit mehr Informationen zu kommen. Ich habe es mehrere Zeilen gemacht, da ich es ausführlich machen und Debuggen helfen möchte.Gibt es eine Konvention für Java-Ausnahmebedingungsnachrichten?

throw new RuntimeException("Something failed.\n" + 
    "Please provide another dependency on this class\n\n" + 
    " MyClass object = new MyClass(depdencyA, dependencyB)"); 

Aber sollte ich es tun? Scheint so, als ob viele Ausnahmen Einzeiler sind, aber ich fühle mich, als wäre es nicht ausführlich genug.

FYI, ich schreibe Gradle Plugins, also lassen Sie mich bitte wissen, wenn es andere Konventionen gibt.

Wenn es einen gibt, bitte zeigen Sie mir Referenzen oder Dokumentationen von Behörden wie Oracle.

+0

Ich habe noch nie von einer weithin etablierten Konvention gehört. Für Produktionscode möchten Sie möglicherweise eine eindeutige ID wie ERR-314546 hinzufügen, damit Sie in der Benutzerdokumentation einfach darauf zugreifen können und die automatisierte Verarbeitung vereinfacht wird. –

Antwort

1

Ausnahmen (und Ausnahmemeldungen) sollten so präzise und präzise wie möglich sein.

Sie sollten genügend Informationen geben, um das Problem zu lokalisieren und den Benutzer (oder Administrator) darüber informieren, wie das Problem zu lösen ist.

Ihr Beispiel nicht auf diesen Punkten:

  1. RuntimeException ist sehr allgemein - wählen Sie eine speziellere Ausnahmetyp (vielleicht einiger bestehenden Ausnahmetyp, vielleicht einigen Ausnahmetyp Sie erstellen)
  2. „Etwas ist fehlgeschlagen.“ ist unnötig - wenn alles in Ordnung wäre, würde man keine Ausnahme werfen
  3. "Bitte geben Sie eine weitere Abhängigkeit von dieser Klasse an" - wenn Ihre Klasse eine bestimmte Anzahl von Abhängigkeiten benötigt, teilen Sie dem Benutzer folgendes mit: "Nur 2 von 5 Abhängigkeiten geliefert" . Oder teilen Sie dem Benutzer mit, welche Abhängigkeit fehlt: "No DataSource found"
  4. "MyClass object = new MyClass (dependencyA, dependencyB)" - dieser Teil setzt auf der Benutzerseite einige Aufrufe voraus. Was ist, wenn Ihr Konstruktor/Methode über Reflektion oder über eine Methodenreferenz aufgerufen wird?
  5. Der genaue Ort, an dem die Ausnahme auch im Stack-Trace enthalten ist, ausgelöst wird - ist diese Informationen nicht in der Ausnahmemeldung wieder
+0

Ist es sinnvoll, meine Ausnahmen zu kategorisieren, indem ich neue Exception-Klassen wie 'InsufficientDependencyException' erstelle und meine Beschreibungen als Nachricht hinterlasse 'Bitte geben Sie eine weitere Abhängigkeit von dieser Klasse an? In diesem Fall kann ich auch dieser Exception-Klasse benutzerdefinierte Felder hinzufügen. – Nicholas

+1

@ Nicholas das Hinzufügen von benutzerdefinierten Feldern zu Ihrer 'Exception'-Klasse macht nur Sinn, wenn der Fänger der Ausnahme Ihre spezifische Ausnahmeklasse kennt und auf diese benutzerdefinierten Felder zugreifen kann. Das bedeutet im Allgemeinen, dass benutzerdefinierte Felder nur zu Ausnahmen hinzugefügt werden sollten, die Sie selbst fangen werden. –

0

Es gibt keine allgemeinen Konventionen. Jedoch:

  1. Werfen eine RuntimeException so ist in der Regel eine schlechte Idee.

  2. Ausführliche Ausnahmemeldungen können überwältigend sein, wenn sie an einen normalen Benutzer gerichtet sind.

  3. Es gibt keine Garantie dafür, dass Markup (wie Zeilenumbrüche, Tabs usw.), die in einer Ausnahmebedingungsnachricht eingebettet sind, sinnvoll behandelt werden. (Für den Anfang können Sie die Zeichenbreite des Fensters nicht vorhersagen, in dem die Meldung angezeigt, und (auch), ob eine Schrift mit fester Breite verwendet werden.)

  4. Internationalisierung ....

Für den Gradle-Fall können (sollten) Sie überprüfen, was andere Plugins tun, und sehen Sie, wie Gradle mehrzeilige Ausnahmemeldungen behandelt.


Eine weitere Möglichkeit, mit der Bereitstellung von zusätzlichen Details für die Diagnose zu behandeln ist die Anwendung des Logger zu verwenden, um eine INFO oder DEBUG Veranstaltung mit den Details zur Anmeldung ... vor Sie die Ausnahme werfen.

+0

Ausnahmen sollten niemals von einem normalen Benutzer gesehen werden! Ich weiß, das ist das Ziel, nicht immer die Realität, aber ich würde nicht darauf eingehen, was ein gewöhnlicher Benutzer sehen könnte. – TofuBeer

+0

@TofuBeer - Ja. Aber wir sprechen hier über ein Gradle-Plugin, und Ausnahmemeldungen könnten der Standard (oder nur!) Weg sein, um Diagnosen zu bekommen. (Und Sie würden hoffen, dass ein Gradle-Benutzer normalerweise ein Entwickler ist, der genügend "Eindeutigkeit" hat, um eine Ausnahmebedingung zu generieren!) –

Verwandte Themen