Kernpunkte
In der Softwareentwicklung gilt auch Murphy's Law: Alles, was schief gehen kann, wird schief gehen. Bei nicht-einfacher Programmen stellt sich die Frage nicht, ob einen Fehler macht, sondern wenn einen Fehler macht. Standard -inkompatible, nicht unterstützte Funktionen und Browserfunktionen sind nur einige Quellen potenzieller Probleme, mit denen Webentwickler konfrontiert sind. Angesichts all der Probleme, die auftreten können, hat JavaScript eine überraschend einfache Fehlerbehandlung - es gibt nur auf und scheitert lautlos. Zumindest ist dies das Verhalten des Benutzers. Tatsächlich sind viele Dinge hinter den Kulissen geschehen. Wenn eine JavaScript -Anweisung einen Fehler erzeugt, wird gesagt, dass sie eine
-Ausnahmeauswirkt. Der JavaScript -Interpreter führt die nächste Anweisung nicht weiter aus, sondern überprüft den Ausnahmebehandlungscode. Wenn es keinen Ausnahmebehandler gibt, kehrt das Programm aus einer Funktion zurück, die die Ausnahme auswirkt. Dies wiederholt jede Funktion auf dem Anrufstapel, bis der Ausnahmebehandler gefunden oder die oberste Funktion erreicht ist, wodurch das Programm beendet wird. Fehlerobjekt
Wenn eine Ausnahme auftritt, wird ein Objekt, das den Fehler darstellt, erstellt und geworfen. Die JavaScript-Sprache definiert sieben Arten von integrierten Fehlerobjekten. Diese Fehlertypen sind die Grundlage für die Ausnahmebehandlung. Jeder Fehlertyp wird nachstehend ausführlich beschrieben. Fehler
"Fehler" -Typ wird verwendet, um eine allgemeine Ausnahme anzugeben. Dieser Ausnahmetyp wird am häufigsten verwendet, um benutzerdefinierte Ausnahmen zu implementieren. Das Thema des Erstellens benutzerdefinierter Ausnahmen wird später in diesem Artikel erneut besucht. Das "Fehler" -Objekt wird durch Aufrufen des Konstruktors instanziiert, wie im folgenden Beispiel gezeigt:
Wenn die Zahl den angegebenen Bereich überschreitet, wird eine "RangeRror" -Ausnahme generiert. Beispielsweise haben JavaScript -Nummern die methodische Methode für Tofixed (), die den Parameter "Ziffern" annimmt, um die Anzahl der Ziffern darzustellen, die nach dem Dezimalpunkt erscheinen. Dieser Parameter sollte zwischen 0 und 20 liegen (obwohl einige Browser einen breiteren Bereich unterstützen). Wenn der Wert der "Ziffern" außerhalb dieses Bereichs liegt, wird ein "RangerError" geworfen. Das folgende Beispiel zeigt dies.
var error = new Error("error message");
Bei der Zugriff auf nicht existierende Variablen wird eine "ReferenzError" -Ausnahme ausgelöst. Diese Ausnahmen treten normalerweise auf, wenn ein vorhandener variabler Name vorhanden ist, der falsch geschrieben wird. Im folgenden Beispiel tritt ein "ReferenzError" beim Zugriff auf "Balken" auf. Beachten Sie, dass dieses Beispiel davon ausgeht, dass "Bar" in keinem aktiven Bereich vorhanden ist, wenn versucht wird, Operationen zu erhöhen.
var pi = 3.14159; pi.toFixed(100000); // RangeError
Wenn JavaScript -Sprachregeln verletzt werden, wird ein "SyntaxError" geworfen. Entwickler, die mit Sprachen wie C und Java vertraut sind, werden verwendet, um Syntaxfehler während der Zusammenstellung zu begegnen. Da JavaScript jedoch eine interpretierte Sprache ist, werden Syntaxfehler erst dann erkannt, wenn der Code ausgeführt wird. Syntaxfehler sind eindeutig, da sie der einzige Ausnahmetyp sind, aus dem nicht wiederhergestellt werden kann. Das folgende Beispiel generiert einen Syntaxfehler, da der Anweisung "If" die richtige Klammer fehlt.
function foo() { bar++; // ReferenceError }
Wenn der Wert nicht der erwartete Typ ist, tritt eine Ausnahme von "TypeError" auf. Der Versuch, eine nicht existierende Objektmethode aufzurufen, ist eine häufige Ursache für solche Ausnahmen. Das folgende Beispiel erstellt ein leeres Objekt mit dem Namen "Foo" und versucht dann, seine bar () -Methode aufzurufen. Da bar () nicht definiert ist, wird ein "Typeerror" geworfen, wenn versucht wird, es zu nennen.
if (foo) { // SyntaxError // 缺少右花括号 }
Wenn Methoden wie Encdeuri () und decodeuri () fehlformierte URI begegnen, wird eine "Urierror" -Ausnahme ausgelöst. Das folgende Beispiel generiert einen "Urierror", wenn versucht wird, die Zeichenfolge "%" zu dekodieren. Das "%" -Charakter zeigt den Beginn der URI -Fluchtsequenz an. Da es in diesem Beispiel nichts nach "%" gibt, ist die Zeichenfolge eine ungültige Escape -Sequenz und daher eine missgebildete URI -Komponente.
var foo = {}; foo.bar(); // TypeError
Wenn die Funktion eval () nicht verwendet wird, wird eine Ausnahme von "EvalError" ausgelöst. Diese Ausnahmen werden in der neuesten Version des ECMAScript -Standards nicht verwendet. Um jedoch die Abwärtskompatibilität mit älteren Versionsstandards aufrechtzuerhalten, werden sie weiterhin unterstützt.
Ausnahmebehandlung
Jetzt, da wir wissen, welche Ausnahmen sind, sollten wir lernen, wie sie verhindern können, dass das Programm abstürzt. JavaScript übernimmt Ausnahmen durch die Aussage "Try ... Fang ... endlich". Eine gemeinsame Beispielaussage ist unten aufgeführt.
decodeURIComponent("%"); // URIError
Der erste Teil der Aussage "Try ... Catch ... endlich" ist die "Try" -Klausel. Die Klausel "Try" ist erforderlich, um Codeblöcke zu trennen, von denen Programmierer vermuten, Ausnahmen zu generieren. Die Klausel "Try" muss von ein oder zwei "Fang" und "endlich" Klauseln folgen.
"catch" -Klausel
Der zweite Teil von "Try ... Catch ... endlich" ist die "Catch" -Klausel. Die "Catch" -Klausel ist ein Codeblock, der nur ausgeführt wird, wenn eine Ausnahme in der "Versuch" -Klausel auftritt. Obwohl die Klausel "Catch" optional ist, ist es unmöglich, Ausnahmen ohne sie wirklich zu behandeln. Dies liegt daran, dass die "Catch" -Klausel verhindert, dass Ausnahmen sich im Anrufstapel ausbreiten und die Wiederherstellung der Programme ermöglichen. Wenn im "Try" -Block eine Ausnahme auftritt, wird die Kontrolle sofort an die "Catch" -Klausel übergeben. Die Ausnahme, die auftritt, wird auch zur Verarbeitung an den "Catch" -Block übergeben. Das folgende Beispiel zeigt, wie die Klausel "Catch" verwendet wird, um mit einem "ReferenzError" umzugehen. Beachten Sie, dass das "ReferenzError" -Objekt in der Klausel "Catch" durch die Variable "Ausnahme" verwendet werden kann.
var error = new Error("error message");
komplexe Anwendungen können verschiedene Ausnahmen erzeugen. In diesem Fall kann der "Instanz" -Operator verwendet werden, um verschiedene Arten von Ausnahmen zu unterscheiden. Im folgenden Beispiel wird angenommen, dass die "Try" -Klausel verschiedene Arten von Ausnahmen erzeugen kann. Die entsprechende "Catch" -Klausel verwendet "Instanz", um die Ausnahmen von "TypeError" und "ReferenzError" getrennt von allen anderen Arten von Fehlern zu verarbeiten.
var pi = 3.14159; pi.toFixed(100000); // RangeError
"Schließlich" Klausel
Die letzte Komponente der Anweisung "Try ... Catch ... endlich" ist die optionale Klausel "Endlich". Die "endgültige" Klausel ist ein Codeblock, der nach den Klauseln "Try" und "Catch" ausgeführt wird, unabhängig davon, ob ein Fehler auftritt. Die "endgültige" Klausel ist nützlich, um den Reinigungscode (Schließdateien usw.) aufzunehmen, der ohnehin ausgeführt werden muss. Beachten Sie, dass die Klausel "endgültig" ausgeführt wird, auch wenn eine ungewöhnliche Ausnahme auftritt. In diesem Fall wird die "endgültige" Klausel ausgeführt und die geworfene Ausnahme wird normal fortgesetzt.
Eine interessante Notiz über die Klausel "endgültig" ist, dass die "Versuch" oder "Catch" -Klausel die Anweisung "Rückgabe" ausführt, wird sie ausgeführt. Beispielsweise gibt die folgende Funktion false zurück, da die Klausel "endgültig" der letzte ausgeführte Inhalt ist.
function foo() { bar++; // ReferenceError }
Top An einer Ausnahme
JavaScript ermöglicht es den Programmierern, ihre eigenen Ausnahmen durch Aussagen mit dem Namen "Throw" zu werfen. Dieses Konzept kann für unerfahrene Entwickler etwas verwirrend sein. Immerhin haben Entwickler Schwierigkeiten, Code ohne Fehler zu schreiben, aber die "Throw" -Anweisung führt absichtlich Fehler. Das Abwerfen von Ausnahmen kann jedoch den Code tatsächlich erleichtern, um zu debuggen und zu warten. Wenn Sie beispielsweise aussagekräftige Fehlermeldungen erstellen, ist es einfacher, Probleme zu identifizieren und zu beheben.
Folgende zeigt mehrere Beispiele für die Aussage "Wurf". Die Datentypen sind keine Begrenzung, die als Ausnahmen geworfen werden können. Es gibt auch keine Begrenzung für die Anzahl, mit der die gleichen Daten erfasst und geworfen werden können. Mit anderen Worten, eine Ausnahme kann geworfen, gefangen und dann wieder geworfen werden.
if (foo) { // SyntaxError // 缺少右花括号 }
Während die Anweisung "Throw" mit jedem Datentyp verwendet werden kann, hat die Verwendung integrierter Ausnahmetypen einige Vorteile. Beispielsweise ist Firefox auf diese Objekte spezialisiert, indem Debug -Informationen wie Dateinamen und Zeilennummern hinzugefügt werden, bei denen Ausnahmen auftreten.
Nehmen wir beispielsweise an, dass irgendwo in Ihrer Anwendung ein Teilungsbetrieb stattfindet. Da es möglicherweise eine Situation gibt, in der die Aufteilung durch Null auftritt, kann die Teilung problematisch sein. In JavaScript führen solche Operationen zu "Nan". Dies kann zu verwirrenden Ergebnissen führen, die schwer zu debuggen sind. Wenn sich die App lautstark über die Dividierung durch Null beschwert, ist die Situation viel einfacher. Die folgende "if" -serklärung macht dies durch eine Ausnahme.
var error = new Error("error message");
kann es natürlich angemessener sein, "RangeError" zu verwenden, wie unten gezeigt:
var pi = 3.14159; pi.toFixed(100000); // RangeError
benutzerdefiniertes Ausnahmeobjekt
Wir haben gerade gelernt, wie man benutzerdefinierte Fehlermeldungen mit integrierten Ausnahmetypen generiert. Eine andere Möglichkeit besteht jedoch darin, einen neuen Ausnahmetyp zu erstellen, indem der vorhandene "Fehler" -Typ erweitert wird. Da der neue Typ "Fehler" erbt, kann er wie andere integrierte Ausnahmetypen verwendet werden. Obwohl dieser Artikel keine Erbschaftsthemen in JavaScript erörtert, wird hier eine einfache Technik eingeführt.
Das folgende Beispiel kehrt zum Problem der Abwicklung der Abteilung um Null zurück. Anstatt das "Fehler" oder "RangeError" -Objekt wie zuvor zu verwenden, möchten wir unseren eigenen Ausnahmetyp erstellen. In diesem Beispiel erstellen wir den Ausnahmetyp "DivisionByzeroError". Die Funktion im Beispiel fungiert als Konstruktor unseres neuen Typs. Der Konstruktor ist dafür verantwortlich, die Attribute "Name" und "Nachricht" zugewiesen zu haben. Die letzten beiden Zeilen des Beispiels ermöglichen es dem neuen Typ, das "Fehler" -Objekt zu erben.
function foo() { bar++; // ReferenceError }
Dinge, die Sie an
erinnern solltenJavaScript -Ausnahmehandling FAQ
Was ist der Unterschied zwischen Syntaxfehlern und Laufzeitfehlern in JavaScript?
Andererseits tritt ein Laufzeitfehler während der Programmausführung nach erfolgreicher Zusammenstellung auf. Diese Fehler werden normalerweise durch illegale Operationen verursacht, die vom Code ausgeführt werden. Der Versuch, auf eine undefinierte Variable zuzugreifen oder eine nicht vorhandene Funktion aufzurufen, kann beispielsweise einen Laufzeitfehler verursachen.
Wie gehe ich mit Ausnahmen in JavaScript um?
var error = new Error("error message");
Der "endgültige" Block in JavaScript wird verwendet, um Code nach dem Versuch auszuführen, unabhängig vom Ergebnis. Dies bedeutet, dass der Code im "endgültigen" Block unabhängig davon, ob die Ausnahme ausgelöst wird oder nicht, ausgeführt wird. Es wird normalerweise zum Aufräumen verwendet, nachdem der Code ausgeführt wurde, z. B. das Schließen von Dateien oder das Löschen von Ressourcen.
Ja, JavaScript können Sie Ihre eigene Ausnahme mit der Anweisung "Throw" ausgeben. Sie können jede Art von Ausnahme, einschließlich Zeichenfolgen, Zahlen, booleschen Werten oder Objekten, auswerfen. Sobald eine Ausnahme ausgelöst ist, wird der normale Prozess des Programms gestoppt und die Kontrolle an den jüngsten Ausnahmebehandler übergeben.
JavaScript können Sie benutzerdefinierte Fehlertypen erstellen, indem Sie das integrierte Fehlerobjekt erweitern. Dies ist nützlich, wenn Sie einen bestimmten Fehlertyp in Ihren Code werfen möchten. Hier ist ein Beispiel:
var pi = 3.14159; pi.toFixed(100000); // RangeError
Fehlerausbreitung bezieht sich auf den Prozess, einen Fehler zu übergeben, von dem er im Anrufstapel auf den nächsten Ausnahmebehandler geworfen wurde. Wenn in der Funktion, die den Fehler wirft, kein Fehler erfasst wird, wird er nach oben in die Aufruffunktion und so weiter verbreitet, bis er erfasst oder den globalen Bereich erreicht wird. An diesem Punkt wird das Programm beendet.
JavaScript liefert die Methode console.Error () zum Protokoll -Fehler. Diese Methode funktioniert genauso wie console.log (), enthält jedoch auch eine Stapelspur im Protokoll und zeigt die Nachricht als Fehler in der Konsole hervor. Hier ist ein Beispiel:
function foo() { bar++; // ReferenceError }
In JavaScript geben sowohl "Null" als auch "undefined" fehlende Werte an. Sie werden jedoch in leicht unterschiedlichen Kontexten verwendet. "Undefiniert" bedeutet, dass eine Variable deklariert wurde, aber kein Wert zugewiesen wurde. "Null" hingegen ist ein Zuordnungswert, der keinen Wert oder kein Objekt angibt.
asynchrone Fehler können mit Versprechen oder Asynchronisation in JavaScript behandelt werden. Promise hat eine "Catch" -Methode, die aufgerufen wird, wenn Versprechen abgelehnt wird. Mit Async/Awit können Sie den Try/Catch -Block genauso wie mit Synchroncode verwenden. Hier ist ein Beispiel mit Async/Warte:
if (foo) { // SyntaxError // 缺少右花括号 }
Wenn die Operation nicht ausgeführt werden kann, wird normalerweise ein Typeerror in JavaScript geworfen, wenn der Wert nicht der erwartete Typ ist. Beispielsweise führt der Versuch, eine Nicht-Funktion aufzurufen oder auf eine undefinierte Eigenschaft zuzugreifen, zu einem TypenError.
Das obige ist der detaillierte Inhalt vonAußergewöhnliche Ausnahmeregelung in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!