Ich bin auf der Suche zu beginnen mein JavaScript ein bisschen mehr Fehler Beweis zu machen, und ich bin viel Dokumentation finden , über die Verwendung try
, catch
, finally
und throw
, aber ich bin nicht eine Tonne Rat von Experten auf der Suche nach, wann und wo Fehler zu werfen.
- Sollte jeder Code in einen Versuch / Fang eingewickelt werden?
- Gibt es weitere Ratschläge wie diesen, an welchem Punkt Fehler abgefangen werden sollten?
- Gibt es Nachteile beim Auslösen von Fehlern, anstatt dass Code in der Produktion stillschweigend ausfällt?
- Dies wurde in Bezug auf Implementierungen auf SO angesprochen, aber sind JS-Fehler bei der Serverprotokollierung eine wirksame Strategie?
- Was sollte ich sonst noch über das Einfangen von Fehlern in meiner Anwendung wissen?
Ich bin auch ein absolutes Spiel, um von Büchern zu hören, die großartige Kapitel oder ausführliche Erklärungen zur Fehlerbehandlung enthalten. Eloquentes JavaScript geht auf die Angelegenheit ein, ist jedoch in Bezug auf das Problem nicht sehr präskriptiv oder unvoreingenommen.
Vielen Dank für jeden Rat, den Sie geben können!
javascript
error-handling
Joshua Cody
quelle
quelle
Antworten:
Eine immens interessante Reihe von Folien zur Behandlung von JavaScript-Fehlern in Unternehmen finden Sie unter http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/
Kurz gesagt, es fasst zusammen:
Die Folien gehen viel detaillierter und geben Ihnen höchstwahrscheinlich eine Richtung.
AKTUALISIEREN
Die oben erwähnte Präsentation finden Sie hier: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
quelle
Nicholas Zakas von Yahoo! Bei Ajax Experience 2008 hielt Fame einen Vortrag über Enterprise Error Handling ( Folien ), in dem er Folgendes vorschlug:
Ein Jahr später veröffentlichte Nicholas Zakas ein Update in seinem Blog, das ein cleveres Muster enthielt, mit dem Fehlerbehandlungscode automatisch in Ihre Produktionsumgebung eingefügt werden kann (mithilfe einer aspektorientierten Programmierung).
Wenn Sie mit der Protokollierung von window.error-Aufrufen beginnen, werden Sie zwei Dinge bemerken:
Das Reduzieren des Stroms von Protokolleinträgen ist so einfach wie das Testen des Schweregrads und / oder einer Zufallszahl, bevor Sie sich beim Server anmelden:
Die Behandlung des nutzlosen Fehlers "window.error in undefined: 0" hängt von Ihrer Site-Architektur ab, kann jedoch versuchen, alle Ajax-Aufrufe zu identifizieren und eine Ausnahme auszulösen, wenn etwas fehlschlägt (möglicherweise wird eine Stapelverfolgung mit stacktrace.js zurückgegeben ).
quelle
if (global.logJSError) if (Math.random() < .01) logJSError('bootloader', {
(Zugegeben, dieser Code drosselt nicht alle Fehler, sondern nur eine bestimmte Klasse von Timeout-Fehlern)IHMO, Sie sollten die Fehlerbehandlung in Javascript wie in mehreren anderen Sprachen (AFAIK: Python, Java) verwenden.
Für eine bessere Lesbarkeit (und wahrscheinlich eine bessere Leistung, obwohl ich nicht sicher bin, ob dies einen wirklich großen Einfluss hat) sollten Sie den try / catch-Block hauptsächlich in den folgenden Fällen verwenden:
Der Teil des Codes, den Sie umbrechen möchten, ist ein wichtiger Teil des gesamten Algorithmus . Wenn es fehlschlägt, könnte es:
Sie wissen, dass der Code, den Sie schreiben, nicht mit jedem Browser kompatibel ist
Möglicherweise haben Javascript-Experten andere Elemente zu geben.
meine 2 Cent auf die Box,
Grüße,
Max
quelle
Zusätzlich zu den anderen Antworten: Eine wichtige Sache ist die Verwendung von Kontextdaten, die in JavaScript-Fehlerobjekten und in den
window.onerror
Funktionsparametern verfügbar sind .Dinge wie der Stacktrace (errorObject.stack), der Dateiname, die Zeilennummer und die Spaltennummer. Beachten Sie, dass jeder Browser einige Unterschiede aufweist. Versuchen Sie also nach besten Kräften, nette Fehler zu erhalten.
Es kann sogar Probleme mit dem Konsolenobjekt selbst geben . Ich verwende eine benutzerdefinierte window.onerror-Funktion, die von dieser inspiriert ist, und eine spezielle Funktion, um ein bestimmtes Standardfehlerobjekt zu verfolgen, das von diesem Code inspiriert ist .
Ein weiterer guter Punkt ist, die Version Ihrer Webanwendung irgendwo in der Nähe des Stacktraces einzuschließen (zum schnellen und sicheren Kopieren und Einfügen). Möglicherweise werden Fehler im Entwicklungsmodus auch aggressiver angezeigt (Warnung ...), da Entwickler die Browserkonsole nicht ständig überwachen und einige der Probleme möglicherweise nicht sehen.
Verwenden Sie auch vermeiden
throw 'My message'
, verwendenthrow new Error('My message')
, können Sie sogar benutzerdefinierte Fehler haben, lesen Sie diesen Artikel .Fügen Sie den Fehlern immer einen Kontext hinzu (die Version, die ID des Objekts, eine benutzerdefinierte Nachricht, ...) und stellen Sie außerdem sicher, dass Sie zwischen externen Fehlern (einige externe Daten oder Umstände haben Ihr System zum Ausfall gebracht) und internen Fehlern unterscheiden / assertions (Ihr eigenes System ist durcheinander), lesen Sie über ' Design by Contract '.
Hier ist eine Anleitung .
Denken Sie auch an die Verwendung einer allgemeinen Fehlerbehandlung wie Interceptors für Ihre Bibliotheken und Frameworks:
quelle