Ist es empfehlenswert, Ausnahmen zu verwenden und Ausnahmen auszulösen / abzufangen, anstatt 0 oder 1 von Funktionen zurückzugeben und dann if / else zu verwenden, um die Fehler zu behandeln? Auf diese Weise wird es einfacher, den Benutzer über das Problem zu informieren.
Nein nein Nein!
Mischen Sie keine Ausnahmen und Fehler. Ausnahmen sind außergewöhnlich. Fehler gibt es nicht. Wenn Sie einen Benutzer auffordern, eine Menge eines Produkts einzugeben, und der Benutzer "Hallo" eingibt, liegt ein Fehler vor. Dies ist keine Ausnahme: Es ist nichts Außergewöhnliches, wenn eine ungültige Eingabe des Benutzers angezeigt wird. Warum können Sie Ausnahmen nicht in Ausnahmefällen verwenden, z. B. bei der Validierung von Eingaben? Andere erklärten es bereits und zeigten eine gültige Alternative für die Eingabevalidierung.
Dies bedeutet auch, dass sich der Benutzer nicht um Ihre Ausnahmen kümmert und das Anzeigen der Ausnahmen sowohl unfreundlich als auch gefährlich ist . Beispielsweise zeigt eine Ausnahme während der Ausführung einer SQL-Abfrage häufig die Abfrage selbst an. Sind Sie sicher, dass Sie ein Risiko eingehen möchten, um diese Botschaft allen zu zeigen?
Es kann mehr als ein Fehler auftreten, z. B. ein Datenbankproblem, ein doppelter Eintrag, ein Serverproblem usw. Wenn während der Registrierung ein Problem auftritt, muss der Benutzer darüber informiert werden.
Falsch. Als Benutzer muss ich Ihre Datenbankprobleme, doppelten Einträge usw. nicht kennen. Ihre Probleme interessieren mich wirklich nicht . Was ich wissen muss ist, dass ich einen Benutzernamen eingegeben habe, der bereits existiert. Wie bereits gesagt, muss eine falsche Eingabe von mir einen Fehler auslösen, keine Ausnahme.
Wie werden diese Fehler ausgegeben? Es kommt auf den Kontext an. Für einen bereits verwendeten Benutzernamen würde ich gerne eine kleine rote Fahne neben dem Benutzernamen sehen, bevor ich das Formular abschicke, die besagt, dass der Benutzername bereits verwendet wird. Ohne JavaScript muss dieselbe Flagge nach der Übermittlung angezeigt werden.
Bei anderen Fehlern würden Sie eine vollständige Seite mit einem Fehler anzeigen oder eine andere Methode wählen, um den Benutzer darüber zu informieren, dass ein Fehler aufgetreten ist (z. B. eine Meldung, die angezeigt wird und dann oben auf der Seite ausgeblendet wird). Die Frage bezieht sich dann mehr auf die Benutzererfahrung als auf die Programmierung.
Aus Sicht der Programmierer werden Sie den Fehler je nach Art des Fehlers auf unterschiedliche Weise verbreiten. Wenn beispielsweise ein Benutzername bereits vergeben ist, gibt eine AJAX-Anfrage nach http://example.com/?ajax=1&user-exists=John
ein JSON-Objekt zurück, das Folgendes angibt:
- Dass der Benutzer bereits existiert,
- Die Fehlermeldung, die dem Benutzer angezeigt werden soll.
Der zweite Punkt ist wichtig: Sie möchten sicherstellen, dass beim Senden des Formulars mit deaktiviertem JavaScript und beim Eingeben eines doppelten Benutzernamens mit aktiviertem JavaScript dieselbe Meldung angezeigt wird. Sie möchten den Text der Fehlermeldung nicht im serverseitigen Quellcode und in JavaScript duplizieren!
Dies ist tatsächlich die Technik, die von Stack Exhange-Websites verwendet wird. Wenn ich zum Beispiel versuche, meine eigene Antwort zu verbessern, enthält die AJAX-Antwort den anzuzeigenden Fehler:
{"Success":false,"Warning":false,"NewScore":0,"Message":"You can't vote for your own post.",
"Refresh":false}
Sie können auch einen anderen Ansatz wählen und die Fehler auf der HTML-Seite voreinstellen, bevor das Formular ausgefüllt wird. Vorteile: Sie müssen die Fehlermeldung nicht in der AJAX-Antwort senden. Nachteile: Wie steht es mit der Barrierefreiheit? Wenn Sie versuchen, die Seite ohne CSS zu durchsuchen, werden alle möglichen Fehler angezeigt.
Ja Ja Ja!
Wenn Sie sauberen Code haben möchten, sollten Sie fast ausschließlich Ausnahmen verwenden und keine Fehlercodes verwenden. Fehlercodes sind bedeutungslos. Sie sind fast immer an eine numerische Konstante gebunden, die nicht viele Informationen preisgibt. Dadurch kann Ihr Code unleserlich werden und es wird schwierig, Daten zusammen mit dem Fehler weiterzugeben.
Ausnahmen sind Klassen und können beliebige Informationen enthalten. Der Benutzer hat also eine falsche Eingabe wie 'abc' für ein Zahlenfeld eingegeben. Mit einem Fehlercode könnten Sie diese Informationen nicht ohne viel Blubbern an den Behandler des Fehlers weitergeben. Etwas, das Ausnahmen kostenlos zur Verfügung stellen. Mit Ausnahmen können Sie aussagekräftige Rückgabewerte in Funktionen und Methoden haben und trotzdem elegant versagen. Noch besser ist, dass Ausnahmen direkt an den Ort weitergegeben werden, an dem Sie sie bearbeiten möchten! Stellen Sie sich die Menge an Spaghetti-Code vor, die Sie benötigen, um einen Fehlercode mit aussagekräftigen Daten an einen Handler weiterzuleiten, der ein oder zwei Ebenen darüber liegt.
Ausnahmen drücken sich auch semantischer aus als Fehlercodes. Fehlercodes führen zu Spaghetti-Code, während die Ausnahmebehandlung zu sauberem Code führt.
Außerdem kann man leicht vergessen, die Statuscodes zu überprüfen. In Sprachen wie Java sind Sie gezwungen, Ausnahmen zu behandeln (etwas, das beispielsweise in C # fehlt).
Verwenden Sie Ausnahmen und behandeln Sie sie in Ihren Controllern.
quelle
Betrachten Sie diese handliche kleine Klasse:
Das ist eine gute Verwendung von Ausnahmen. Aus der
FunkyFile's
Perspektive kann absolut nichts unternommen werden, um die Situation zu verbessern, wenn der Pfad ungültig ist oderfile_get_contents
fehlschlägt. Eine wirklich außergewöhnliche Situation;)Aber gibt es einen Wert für Ihren Benutzer zu wissen, dass Sie irgendwo in Ihrem Code auf einen falschen Dateipfad gestoßen sind? Beispielsweise:
Abgesehen davon, dass Sie anderen mitteilen, dass Sie einen schlechten Tag haben, haben Sie folgende Möglichkeiten:
Zurückfallen
Haben Sie eine andere Möglichkeit, die Informationen zu erhalten? In meinem einfachen Beispiel oben scheint dies nicht wahrscheinlich zu sein, es sei jedoch ein Master / Slave-Datenbankschema in Betracht gezogen. Der Master hat möglicherweise nicht geantwortet, aber vielleicht ist der Slave noch da draußen (oder umgekehrt).
Ist es die Schuld des Benutzers?
Hat der Benutzer eine fehlerhafte Eingabe übermittelt? Nun, erzähl ihr davon. Sie können entweder eine Fehlermeldung anstoßen oder nett sein und dieser Fehlermeldung ein Formular beilegen, damit sie den richtigen Pfad eingeben kann.
Ist es deine Schuld?
Und unter Ihnen verstehe ich alles, was nicht der Benutzer ist. Das reicht von der Eingabe eines falschen Dateipfads bis hin zu Fehlern auf Ihrem Server. Genau genommen ist es Zeit für einen 503-HTTP-Fehler , da der Dienst nicht verfügbar ist. CI hat eine
show_404()
Funktion, die man einfach aufbauen kannshow_503()
.Ratschlag, sollten Sie Rogue-Ausnahmen berücksichtigen. CodeIgniter ist ein unordentlicher Code, und Sie wissen nie, wann eine Ausnahme auftritt. In ähnlicher Weise können Sie Ihre eigenen Ausnahmen vergessen, und die sicherste Option ist die Implementierung eines Catch-All-Exception-Handlers. In PHP können Sie das mit set_exception_handler machen :
Und Sie können sich auch über set_error_handler um unerwünschte Fehler kümmern . Sie können entweder den gleichen Handler wie für Ausnahmen schreiben oder alternativ alle Fehler in konvertieren
ErrorException
und von Ihrem Ausnahmehandler behandeln lassen:quelle