Diese Nachrichten sind für andere Entwickler
Es wird erwartet, dass diese Nachrichten von Entwicklern gelesen werden , um sie beim Debuggen der Anwendung zu unterstützen. Dies kann zwei Formen annehmen:
Aktives Debuggen. Sie führen tatsächlich einen Debugger aus, während Sie Code schreiben und versuchen, herauszufinden, was passiert. In diesem Zusammenhang hilft Ihnen eine hilfreiche Ausnahme, indem Sie leicht nachvollziehen können, was falsch läuft, oder eine Problemumgehung vorschlagen (obwohl dies optional ist).
Passives Debuggen. Der Code wird in der Produktion ausgeführt und schlägt fehl. Die Ausnahme wird protokolliert, aber Sie erhalten nur die Nachricht und den Stack-Trace. In diesem Zusammenhang hilft Ihnen eine hilfreiche Ausnahmemeldung, den Fehler schnell zu lokalisieren.
Da diese Nachrichten häufig protokolliert werden, sollten Sie dort auch keine vertraulichen Informationen (z. B. private Schlüssel oder Kennwörter) angeben, auch wenn das Debuggen der App hilfreich sein könnte.
Beispielsweise ist der IOSecurityException
Typ einer Ausnahme, die beim Schreiben einer Datei ausgelöst wird, für das Problem nicht eindeutig: Liegt es daran, dass wir keine Zugriffsberechtigung für eine Datei haben? Oder können wir es vielleicht lesen, aber nicht schreiben? Oder existiert die Datei nicht und wir haben keine Berechtigung, Dateien dort zu erstellen? Oder vielleicht ist es gesperrt (hoffentlich ist der Typ der Ausnahme in diesem Fall anders, aber in der Praxis können Typen manchmal kryptisch sein). Oder verhindert Code Access Security, dass wir E / A-Vorgänge ausführen können?
Stattdessen:
IOSecurityException: Die Datei wurde gefunden, die Berechtigung zum Lesen des Inhalts wurde jedoch verweigert.
ist viel expliziter. Hier wissen wir sofort, dass die Berechtigungen für das Verzeichnis richtig eingestellt sind (andernfalls können wir nicht wissen, dass die Datei vorhanden ist), aber Berechtigungen auf Dateiebene sind problematisch.
Dies bedeutet auch, dass Sie die Nachricht leer lassen können , wenn Sie keine zusätzlichen Informationen angeben können, die nicht bereits im Typ der Ausnahme enthalten sind. DivisionByZeroException
ist ein gutes Beispiel, wo die Nachricht redundant ist. Die Tatsache, dass Sie in den meisten Sprachen eine Ausnahme ohne Angabe der Nachricht auslösen können, hat einen anderen Grund: Entweder weil die Standardnachricht bereits verfügbar ist oder weil sie bei Bedarf später generiert wird (und die Generierung dieser Nachricht ist in den Ausnahmetyp eingeschlossen, was durchaus Sinn macht ( "OOPly" ).
Beachten Sie, dass einige Nachrichten aus technischen Gründen (häufig aus Gründen der Leistung) wesentlich kryptischer sind, als sie sollten. .NET's NullReferenceException
:
Der Objektverweis wurde nicht auf eine Instanz eines Objekts festgelegt.
ist ein hervorragendes Beispiel für eine Nachricht, die nicht hilfreich ist. Eine hilfreiche Nachricht wäre:
Die product
Objektreferenz wurde beim Aufrufen nicht auf eine Instanz eines Objekts festgelegt product.Price
.
Diese Nachrichten sind nicht für Endbenutzer!
Es wird nicht erwartet, dass Endbenutzer Ausnahmemeldungen sehen. Noch nie. Obwohl einige Entwickler diese Nachrichten den Benutzern zeigen, führt dies zu einer schlechten Benutzererfahrung und Frustration. Nachrichten wie:
Der Objektverweis wurde nicht auf eine Instanz eines Objekts festgelegt.
Für den Endverbraucher bedeutet dies absolut nichts und sollte unter allen Umständen vermieden werden.
Das schlimmste Szenario ist ein globaler Try / Catch, der die Ausnahme für den Benutzer auslöst und die App beendet. Eine Anwendung, die sich um ihre Benutzer kümmert:
Behandelt Ausnahmen an erster Stelle. Die meisten können gehandhabt werden, ohne den Benutzer zu stören. Netzwerk ist ausgefallen? Warum nicht ein paar Sekunden warten und es erneut versuchen?
Verhindert, dass ein Benutzer die Anwendung in einen Ausnahmefall führt. Wenn Sie den Benutzer auffordern, zwei Zahlen einzugeben und die erste durch die zweite zu teilen, warum sollten Sie den Benutzer im zweiten Fall die Eingabe von Null zulassen, um ihm einige Sekunden später die Schuld zu geben ? Wie wäre es, wenn Sie das Textfeld rot markieren (mit einem hilfreichen Tooltipp, der besagt, dass die Zahl nicht Null sein sollte) und die Schaltfläche zum Überprüfen deaktivieren, bis das Feld rot bleibt?
Fordert einen Benutzer auf, eine Aktion in einer Form auszuführen, die kein Fehler ist. Es sind nicht genügend Berechtigungen vorhanden, um auf eine Datei zuzugreifen. Bitten Sie den Benutzer, Administratorberechtigungen zu erteilen, oder wählen Sie eine andere Datei aus.
Wenn nichts anderes funktioniert, wird ein hilfreicher, freundlicher Fehler angezeigt, der speziell geschrieben wurde, um die Frustration des Benutzers zu verringern, dem Benutzer zu helfen, zu verstehen, was schief gelaufen ist, und schließlich das Problem zu lösen, und ihm zu helfen, den Fehler in Zukunft zu verhindern (falls zutreffend).
In Ihrer Frage haben Sie vorgeschlagen, zwei Nachrichten in einer Ausnahme zu haben: eine technische für Entwickler und eine für Endbenutzer. Obwohl dies in einigen geringfügigen Fällen ein gültiger Vorschlag ist, werden die meisten Ausnahmen auf einer Ebene erstellt, auf der es unmöglich ist, eine aussagekräftige Nachricht für die Benutzer zu erstellen. DivisionByZeroException
Stellen Sie sich vor, wir könnten die Ausnahme nicht verhindern und können sie nicht selbst handhaben. Weiß das Framework (da es sich um das Framework und nicht um den Geschäftscode handelt, der die Ausnahme auslöst), was für einen Benutzer eine hilfreiche Nachricht sein wird, wenn die Aufteilung erfolgt? Absolut nicht:
Die Division durch Null ist aufgetreten. [OKAY]
Stattdessen kann man es die Ausnahme auslösen lassen und sie dann auf einer höheren Ebene abfangen, auf der wir den Geschäftskontext kannten, und dementsprechend handeln, um dem Endbenutzer tatsächlich zu helfen. Auf diese Weise wird Folgendes angezeigt:
Das Feld D13 kann nicht den gleichen Wert wie das Feld E6 haben, da die Subtraktion dieser Werte als Divisor verwendet wird. [OKAY]
oder vielleicht:
Die vom ATP-Service gemeldeten Werte stimmen nicht mit den lokalen Daten überein. Dies kann daran liegen, dass die lokalen Daten nicht synchron sind. Möchten Sie die Versandinformationen synchronisieren und erneut versuchen? [Ja Nein]
Diese Nachrichten sind nicht zum Parsen gedacht
Es wird nicht erwartet, dass Ausnahmenachrichten analysiert oder programmgesteuert verwendet werden. Wenn Sie der Meinung sind, dass der Anrufer zusätzliche Informationen benötigen kann, fügen Sie diese neben der Nachricht in die Ausnahme ein. Dies ist wichtig, da die Nachricht ohne vorherige Ankündigung geändert werden kann. Type ist ein Teil der Schnittstelle, die Meldung jedoch nicht: Verlassen Sie sich bei der Ausnahmebehandlung niemals darauf.
Stellen Sie sich die Ausnahmemeldung vor:
Die Verbindung zum Caching-Server wurde unterbrochen, nachdem 500 ms gewartet wurden. Erhöhen Sie entweder das Zeitlimit oder überprüfen Sie die Leistungsüberwachung, um einen Rückgang der Serverleistung festzustellen. Die durchschnittliche Wartezeit für den Caching-Server betrug 6 ms. für den letzten Monat 4 ms. für die letzte Woche und 377 ms. für die letzte Stunde.
Sie möchten die Werte "500", "6", "4" und "377" extrahieren. Denken Sie ein wenig über den Ansatz nach, den Sie für das Parsen verwenden, und lesen Sie dann erst weiter.
Sie haben die Idee? Groß.
Nun entdeckte der ursprüngliche Entwickler einen Tippfehler:
Connecting to the caching sever timed out after waiting [...]
sollte sein:
↓
Connecting to the caching server timed out after waiting [...]
Darüber hinaus ist der Entwickler der Ansicht, dass Monat / Woche / eine Stunde nicht besonders relevant sind, weshalb er auch eine zusätzliche Änderung vornimmt:
Die durchschnittliche Wartezeit für den Caching-Server betrug 6 ms. für den letzten Monat 5 ms. für die letzten 24 Stunden und 377 ms. für die letzte Stunde.
Was passiert mit deinem Parsen?
Anstatt zu analysieren, könnten Sie Ausnahmeeigenschaften verwenden (die enthalten können, was immer Sie wollen, sobald die Daten serialisiert werden können):
{
message: "Connecting to the caching [...]",
properties: {
"timeout": 500,
"statistics": [
{ "timespan": 1, "unit": "month", "average-timeout": 6 },
{ "timespan": 7, "unit": "day", "average-timeout": 4 },
{ "timespan": 1, "unit": "hour", "average-timeout": 377 },
]
}
}
Wie einfach ist es jetzt, diese Daten zu verwenden?
Manchmal (z. B. in .NET) kann die Nachricht sogar in die Sprache des Benutzers übersetzt werden (IMHO ist die Übersetzung dieser Nachrichten absolut falsch, da erwartet wird, dass jeder Entwickler in der Lage ist, auf Englisch zu lesen). Das Parsen solcher Nachrichten ist nahezu unmöglich.