Kann ich benutzerdefinierte Typen für benutzerdefinierte Ausnahmen in JavaScript definieren? Wenn ja, wie würde ich das machen?
javascript
exception
Manki
quelle
quelle
Antworten:
Von WebReference :
quelle
catch (e) { if (e instanceof TypeError) { … } else { throw e; } }
⦃⦄ odercatch (e) { switch (e.constructor) { case TypeError: …; break; default: throw e; }
⦃⦄.Sie sollten eine benutzerdefinierte Ausnahme erstellen, die prototypisch von Error erbt. Beispielsweise:
Dies ist im Grunde eine vereinfachte Version von dem, was oben veröffentlicht wurde, mit der Verbesserung, dass Stack-Traces in Firefox und anderen Browsern funktionieren. Es erfüllt die gleichen Tests, die er veröffentlicht hat:
Verwendung:
Und es wird sich verhalten wird erwartet:
quelle
Sie können Ihre eigenen Ausnahmen und deren Behandlung beispielsweise wie folgt implementieren:
Es gibt eine andere Syntax zum Abfangen einer typisierten Ausnahme, obwohl dies nicht in jedem Browser funktioniert (z. B. nicht im IE):
quelle
Ja. Sie können alles werfen, was Sie wollen: Ganzzahlen, Zeichenfolgen, Objekte, was auch immer. Wenn Sie ein Objekt werfen möchten, erstellen Sie einfach ein neues Objekt, genau wie Sie es unter anderen Umständen erstellen würden, und werfen Sie es dann. Mozillas Javascript-Referenz enthält mehrere Beispiele.
quelle
Dies ermöglicht die Verwendung wie ..
quelle
e instanceof Error
wäre falsch.e instanceof MyError
dies wahr wäre, würde dieelse if(e instanceof Error)
Aussage niemals bewertet werden.else if(e instanceof Error)
wäre der letzte Fang. Wahrscheinlich gefolgt von einem einfachenelse
(was ich nicht aufgenommen habe). So ähnlich wiedefault:
in einer switch-Anweisung, aber für Fehler.Zusamenfassend:
Wenn Sie ES6 ohne Transpiler verwenden :
Informationen zur aktuellen Best Practice finden Sie unter Erweitern des Fehlers in Javascript mit ES6-Syntax
Wenn Sie den Babel-Transpiler verwenden :
Option 1: Verwenden Sie Babel-Plugin-Transform-Builtin-Extend
Option 2: Mach es selbst (inspiriert von derselben Bibliothek)
Wenn Sie reines ES5 verwenden :
Alternative: Verwenden Sie das Classtrophobic- Framework
Erläuterung:
Warum ist die Erweiterung der Fehlerklasse mit ES6 und Babel ein Problem?
Weil eine Instanz von CustomError nicht mehr als solche erkannt wird.
In der Tat, von der offiziellen Dokumentation von Babel, Sie können nicht verlängern jede integrierte JavaScript - Klassen wie
Date
,Array
,DOM
oderError
.Das Problem wird hier beschrieben:
Was ist mit den anderen SO-Antworten?
Alle gegebenen Antworten beheben das
instanceof
Problem, aber Sie verlieren den regulären Fehlerconsole.log
:Mit der oben genannten Methode beheben Sie nicht nur das
instanceof
Problem, sondern behalten auch den regulären Fehler beiconsole.log
:quelle
Hier erfahren Sie, wie Sie benutzerdefinierte Fehler erstellen können, die vollständig mit dem
Error
Verhalten von Native identisch sind . Diese Technik funktioniert nur in Chrome und node.js für jetzt. Ich würde es auch nicht empfehlen, wenn Sie nicht verstehen, was es tut.Als Ergebnis bekommen wir
Dann können Sie es so verwenden:
Und verwenden
NotImplementedError
Sie wie Sie würdenError
:Und es wird sich verhalten wird erwartet:
Beachten Sie, dass dies
error.stack
absolut korrekt funktioniert und keinenNotImplementedError
Konstruktoraufruf enthält (dank v8Error.captureStackTrace()
).Hinweis. Es ist hässlich
eval()
. Der einzige Grund, warum es verwendet wird, ist, richtig zu werdenerr.constructor.name
. Wenn Sie es nicht brauchen, können Sie alles ein bisschen vereinfachen.quelle
Error.apply(self, arguments)
wird angegeben, um nicht zu arbeiten . Ich empfehle stattdessen den Stack-Trace zu kopieren, der browserübergreifend kompatibel ist.Ich verwende oft einen Ansatz mit prototypischer Vererbung. Das Überschreiben
toString()
bietet Ihnen den Vorteil, dass Tools wie Firebug die tatsächlichen Informationen protokollieren und nicht[object Object]
für nicht erfasste Ausnahmen an der Konsole.Verwenden Sie
instanceof
diese Option , um die Art der Ausnahme zu bestimmen.main.js
Exception.js
DuplicateIdException.js
quelle
ES6
Mit der neuen Klasse und erweiterten Schlüsselwörtern ist es jetzt viel einfacher:
quelle
Verwenden Sie die throw- Anweisung.
JavaScript ist es egal, welcher Ausnahmetyp ist (wie Java). JavaScript bemerkt nur, es gibt eine Ausnahme und wenn Sie es abfangen, können Sie "schauen", was die Ausnahme "sagt".
Wenn Sie verschiedene Ausnahmetypen haben, die Sie auslösen müssen, würde ich empfehlen, Variablen zu verwenden, die die Zeichenfolge / das Objekt der Ausnahme enthalten, z. B. die Nachricht. Wo Sie es brauchen, verwenden Sie "throw myException" und vergleichen Sie im catch die abgefangene Ausnahme mit myException.
quelle
Siehe dieses Beispiel im MDN.
Wenn Sie mehrere Fehler definieren müssen (testen Sie den Code hier !):
Code wird meistens kopiert von: Was ist ein guter Weg, um Fehler in JavaScript zu erweitern?
quelle
Eine Alternative zur Antwort von Asselin zur Verwendung mit ES2015-Klassen
quelle
Jetzt setzen wir den Grund oder die gewünschten Eigenschaften zum Fehlerobjekt und rufen es ab. Indem Sie den Fehler vernünftiger machen.
quelle