Ich hatte die "Gelegenheit", mehrere Projekte zu retten, und Führungskräfte ersetzten das gesamte Entwicklerteam, weil die App zu viele Fehler aufwies und die Benutzer die Probleme und das Durcheinander satt hatten. Diese Codebasen hatten alle eine zentralisierte Fehlerbehandlung auf App-Ebene, wie in der Antwort mit der höchsten Bewertung beschrieben. Wenn diese Antwort die beste Vorgehensweise ist, warum hat sie dann nicht funktioniert und dem vorherigen Entwicklerteam ermöglicht, Probleme zu lösen? Vielleicht funktioniert es manchmal nicht? In den obigen Antworten wird nicht erwähnt, wie lange Entwickler damit verbringen, einzelne Probleme zu beheben. Wenn die Zeit zur Behebung von Problemen die Schlüsselmetrik ist, ist es besser, Code mit try..catch-Blöcken zu instrumentieren.
Wie hat mein Team die Probleme behoben, ohne die Benutzeroberfläche wesentlich zu ändern? Einfach, jede Methode wurde mit try..catch blockiert und alles wurde zum Zeitpunkt des Fehlers mit dem Methodennamen, den Methodenparameterwerten, die in einer Zeichenfolge verkettet waren, die zusammen mit der Fehlermeldung, der Fehlermeldung, dem App-Namen, dem Datum, protokolliert wurde, protokolliert. und Version. Mit diesen Informationen können Entwickler die Fehler analysieren, um die Ausnahme zu identifizieren, die am häufigsten auftritt! Oder der Namespace mit der höchsten Anzahl von Fehlern. Es kann auch überprüft werden, ob ein in einem Modul auftretender Fehler ordnungsgemäß behandelt und nicht aus mehreren Gründen verursacht wird.
Ein weiterer Vorteil davon ist, dass Entwickler einen Haltepunkt in der Fehlerprotokollierungsmethode festlegen können. Mit einem Haltepunkt und einem einzigen Klick auf die Debug-Schaltfläche "Aussteigen" befinden sie sich in der Methode, die mit vollem Zugriff auf den tatsächlichen Fehler fehlgeschlagen ist Objekte zum Zeitpunkt des Ausfalls, bequem im unmittelbaren Fenster verfügbar. Es macht das Debuggen sehr einfach und ermöglicht das Zurückziehen der Ausführung zum Anfang der Methode, um das Problem zu duplizieren und die genaue Zeile zu finden. Ermöglicht die zentralisierte Ausnahmebehandlung einem Entwickler, eine Ausnahme in 30 Sekunden zu replizieren? Nein.
Die Anweisung "Eine Methode sollte eine Ausnahme nur abfangen, wenn sie auf vernünftige Weise damit umgehen kann." Dies bedeutet, dass Entwickler jeden Fehler vorhersagen können oder auf ihn stoßen werden, der vor der Veröffentlichung auftreten kann. Wenn dies eine Top-Ebene wäre, würde kein App-Ausnahmebehandler benötigt und es würde keinen Markt für elastische Suche und Logstash geben.
Mit diesem Ansatz können Entwickler auch zeitweise auftretende Probleme in der Produktion finden und beheben! Möchten Sie ohne Debugger in der Produktion debuggen? Oder möchten Sie lieber Anrufe entgegennehmen und E-Mails von verärgerten Benutzern erhalten? Auf diese Weise können Sie Probleme beheben, bevor andere es wissen, und ohne E-Mail, IM oder Slack mit Support, da alles, was zur Behebung des Problems erforderlich ist, genau dort ist. 95% der Ausgaben müssen nie reproduziert werden.
Um ordnungsgemäß zu funktionieren, muss es mit einer zentralen Protokollierung kombiniert werden, die den Namespace / das Modul, den Klassennamen, die Methode, die Eingaben und die Fehlermeldung erfasst und in einer Datenbank speichert, damit es aggregiert werden kann, um hervorzuheben, welche Methode am häufigsten fehlschlägt zuerst behoben.
Manchmal entscheiden sich Entwickler dafür, Ausnahmen aus einem Catch-Block in den Stapel zu werfen, aber dieser Ansatz ist 100-mal langsamer als normaler Code, der nicht auslöst. Das Fangen und Freigeben mit Protokollierung wird bevorzugt.
Diese Technik wurde verwendet, um eine App schnell zu stabilisieren, die für die meisten Benutzer in einem Fortune 500-Unternehmen, das von 12 Entwicklern über 2 Jahre entwickelt wurde, stündlich fehlschlug. Mit diesen 3000 verschiedenen Ausnahmen wurden innerhalb von 4 Monaten verschiedene Ausnahmen identifiziert, behoben, getestet und bereitgestellt. Dies ergibt einen Durchschnitt von 4 Monaten alle 15 Minuten.
Ich bin damit einverstanden, dass es keinen Spaß macht, alles einzugeben, was zur Instrumentierung des Codes erforderlich ist, und ich bevorzuge es, nicht den sich wiederholenden Code zu betrachten, aber das Hinzufügen von 4 Codezeilen zu jeder Methode lohnt sich auf lange Sicht.