Ich möchte einige Dinge in meinen JS-Code werfen und möchte, dass sie eine Fehlerinstanz sind, aber ich möchte auch, dass sie etwas anderes sind.
In Python würde man normalerweise Exception unterordnen.
Was ist in JS angemessen?
quelle
Ich möchte einige Dinge in meinen JS-Code werfen und möchte, dass sie eine Fehlerinstanz sind, aber ich möchte auch, dass sie etwas anderes sind.
In Python würde man normalerweise Exception unterordnen.
Was ist in JS angemessen?
Das einzige Standardfeld, über das das Fehlerobjekt verfügt, ist die message
Eigenschaft. (Siehe MDN oder EcmaScript-Sprachspezifikation, Abschnitt 15.11.) Alles andere ist plattformspezifisch.
Mosts Umgebungen setzen Sie die stack
Eigenschaft, aber fileName
und lineNumber
sind praktisch nutzlos in Vererbung verwendet werden.
Der minimalistische Ansatz lautet also:
function MyError(message) {
this.name = 'MyError';
this.message = message;
this.stack = (new Error()).stack;
}
MyError.prototype = new Error; // <-- remove this if you do not
// want MyError to be instanceof Error
Sie können den Stapel abhören, unerwünschte Elemente daraus entfernen und Informationen wie Dateiname und Zeilennummer extrahieren. Dazu sind jedoch Informationen über die Plattform erforderlich, auf der JavaScript derzeit ausgeführt wird. In den meisten Fällen ist das unnötig - und Sie können es post mortem tun, wenn Sie es wirklich wollen.
Safari ist eine bemerkenswerte Ausnahme. Es gibt keine stack
Eigenschaft, aber die throw
Schlüsselwortsätze sourceURL
und line
Eigenschaften des Objekts, das ausgelöst wird. Diese Dinge sind garantiert richtig.
Von mir verwendete Testfälle finden Sie hier: JavaScript-selbst erstellter Fehlerobjektvergleich .
this.name = 'MyError'
Außenseite der Funktion verschieben und in ändernMyError.prototype.name = 'MyError'
.function MyError(message) { this.message = message; this.stack = Error().stack; } MyError.prototype = Object.create(Error.prototype); MyError.prototype.name = "MyError";
MyError.prototype.constructor = MyError
.this
, oder?In ES6:
Quelle
quelle
var supportsClasses = false; try {eval('class X{}'); supportsClasses = true;} catch (e) {}
this.name = this.constructor.name;
stattdessen die Wartung , um die Wartung zu vereinfachen .Zusamenfassend:
Wenn Sie ES6 ohne Transpiler verwenden :
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 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 jeden 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
class CustomError extends Error { /* ... */}
behandelt herstellerspezifische Argumente (lineNumber
usw.) nicht korrekt. 'Fehler in Javascript mit ES6-Syntax erweitern' ist Babel-spezifisch, wird von Ihrer ES5-Lösung verwendetconst
und es werden keine benutzerdefinierten Argumente verarbeitet.console.log(new CustomError('test') instanceof CustomError);// false
zum Zeitpunkt des Schreibens wahr war, aber jetzt behoben wurde. Tatsächlich wurde das in der Antwort verknüpfte Problem behoben, und wir können das korrekte Verhalten hier testen und den Code in die REPL einfügen und sehen, wie er korrekt transpiliert wird, um mit der richtigen Prototypkette zu instanziieren.Bearbeiten: Bitte lesen Sie die Kommentare. Es stellt sich heraus, dass dies nur in V8 (Chrome / Node.JS) gut funktioniert. Meine Absicht war es, eine browserübergreifende Lösung bereitzustellen, die in allen Browsern funktioniert, und Stack-Trace bereitzustellen, wenn Unterstützung vorhanden ist.
Bearbeiten: Ich habe dieses Community-Wiki erstellt, um mehr Bearbeitung zu ermöglichen.
Die Lösung für V8 (Chrome / Node.JS) funktioniert in Firefox und kann so geändert werden, dass sie im IE größtenteils korrekt funktioniert. (siehe Ende des Beitrags)
Originaler Beitrag zu "Zeig mir den Code!"
Kurzfassung:
Ich bleibe
this.constructor.prototype.__proto__ = Error.prototype
in der Funktion, um den gesamten Code zusammenzuhalten. Sie können aber auch ersetzenthis.constructor
mitUserError
und ermöglicht es Ihnen , den Code außerhalb der Funktion zu bewegen, so dass es nur einmal aufgerufen wird.Wenn Sie diesen Weg gehen, stellen Sie sicher, dass Sie diese Leitung vor dem ersten Werfen anrufen
UserError
.Diese Einschränkung wendet die Funktion nicht an, da Funktionen unabhängig von der Reihenfolge zuerst erstellt werden. So können Sie die Funktion problemlos an das Ende der Datei verschieben.
Browser-Kompatibilität
Funktioniert in Firefox und Chrome (und Node.JS) und erfüllt alle Versprechen.
Internet Explorer schlägt im Folgenden fehl
Fehler müssen nicht damit
err.stack
beginnen, also "es ist nicht meine Schuld".Error.captureStackTrace(this, this.constructor)
existiert nicht, also musst du etwas anderes tun wietoString
hört auf zu existieren, wenn Sie UnterklasseError
. Sie müssen also auch hinzufügen.IE wird nicht als
UserError
ein betrachtet , esinstanceof Error
sei denn, Sie führen die folgenden einige Zeit vor Ihnen austhrow UserError
quelle
Error.call(this)
tut in der Tat nichts, da es einen Fehler zurückgibt , anstatt ihn zu ändernthis
.UserError.prototype = Error.prototype
ist irreführend. Dies führt keine Vererbung durch, dies macht sie zur gleichen Klasse .Object.setPrototypeOf(this.constructor.prototype, Error.prototype)
wirdthis.constructor.prototype.__proto__ = Error.prototype
zumindest für aktuelle Browser bevorzugt .Um das Boilerplate für jede Art von Fehler zu vermeiden , habe ich die Weisheit einiger Lösungen zu einer
createErrorType
Funktion zusammengefasst:Dann können Sie neue Fehlertypen einfach wie folgt definieren:
quelle
this.name = name;
?name
der Prototyp bereits eingestellt ist, ist er nicht mehr erforderlich. Ich habe es entfernt. Vielen Dank!Im Jahr 2018 , ich denke , das ist die beste Art und Weise; das unterstützt IE9 + und moderne Browser.
UPDATE : In diesem Test und Repo finden Sie Vergleiche zu verschiedenen Implementierungen.
Beachten Sie auch, dass das
__proto__
Eigentum veraltet ist, was in anderen Antworten häufig verwendet wird.quelle
setPrototypeOf()
? Zumindest laut MDN wird generell davon abgeraten, es zu verwenden, wenn Sie dasselbe erreichen können, indem Sie einfach die.prototype
Eigenschaft für den Konstruktorelse
festlegen (wie Sie es im Block für Browser tun, die keine habensetPrototypeOf
).setPrototypeOf
. Wenn Sie es jedoch weiterhin benötigen (wie von OP verlangt), sollten Sie die integrierte Methodik verwenden. Wie MDN angibt, wird dies als die richtige Methode zum Festlegen des Prototyps eines Objekts angesehen. Mit anderen Worten, MDN sagt, ändern Sie den Prototyp nicht (da dies die Leistung und Optimierung beeinflusst), sondern verwenden Sie ihn, wenn Sie müssensetPrototypeOf
.CustomError.prototype = Object.create(Error.prototype)
). AußerdemObject.setPrototypeOf(CustomError, Error.prototype)
wird der Prototyp des Konstruktors selbst festgelegt, anstatt den Prototyp für neue Instanzen von anzugebenCustomError
. Wie auch immer, 2016 gibt es meiner Meinung nach einen besseren Weg, um Fehler zu erweitern, obwohl ich immer noch herausfinde, wie ich sie zusammen mit Babel verwenden kann: github.com/loganfsmyth/babel-plugin-transform-builtin-extend/…CustomError.prototype = Object.create(Error.prototype)
ändert auch den Prototyp. Sie müssen es ändern, da in ES5 keine integrierte Erweiterungs- / Vererbungslogik vorhanden ist. Ich bin sicher, dass das von Ihnen erwähnte Babel-Plugin ähnliche Dinge tut.Object.setPrototypeOf
hier keinen Sinn ergibt, zumindest nicht so, wie Sie sie verwenden: gist.github.com/mbrowne/4af54767dcb3d529648f5a8aa11d6348 . VielleichtObject.setPrototypeOf(CustomError.prototype, Error.prototype)
wollten Sie schreiben - das wäre etwas sinnvoller (obwohl es immer noch keinen Vorteil gegenüber dem einfachen Einstellen bietetCustomError.prototype
).Der Vollständigkeit halber - nur weil in keiner der vorherigen Antworten diese Methode erwähnt wurde - ist der gewünschte Effekt mit der integrierten Funktion ziemlich einfach zu erzielen, wenn Sie mit Node.js arbeiten und sich nicht um die Browserkompatibilität kümmern müssen
inherits
desutil
Moduls ( offizielle Dokumente hier ).Angenommen, Sie möchten eine benutzerdefinierte Fehlerklasse erstellen, die einen Fehlercode als erstes Argument und die Fehlermeldung als zweites Argument verwendet:
Datei custom-error.js :
Jetzt können Sie instanziieren und übergeben / werfen
CustomError
:Beachten Sie, dass mit diesem Snippet der Stack-Trace den richtigen Dateinamen und die richtige Zeile hat und die Fehlerinstanz den richtigen Namen hat!
Dies geschieht aufgrund der Verwendung der
captureStackTrace
Methode, die einestack
Eigenschaft für das Zielobjekt erstellt (in diesem Fall dieCustomError
Instanziierung). Weitere Informationen zur Funktionsweise finden Sie in der Dokumentation hier .quelle
this.message = this.message;
Ist das falsch oder gibt es noch verrückte Dinge, die ich über JS nicht weiß?Die Antwort von Crescent Fresh ist irreführend. Obwohl seine Warnungen ungültig sind, gibt es andere Einschränkungen, die er nicht anspricht.
Erstens macht die Argumentation in Crescent 'Absatz "Vorbehalte:" keinen Sinn. Die Erklärung impliziert, dass das Codieren von "ein paar von if (Fehlerinstanz von MyError) else ..." im Vergleich zu mehreren catch-Anweisungen irgendwie lästig oder ausführlich ist. Mehrere Instanzen von Anweisungen in einem einzelnen catch-Block sind genauso präzise wie mehrere catch-Anweisungen - sauberer und prägnanter Code ohne Tricks. Dies ist eine großartige Möglichkeit, um die großartige Fehlerbehandlung für Java-Subtypen zu emulieren.
WRT "Es wird angezeigt, dass die Nachrichteneigenschaft der Unterklasse nicht festgelegt wird". Dies ist nicht der Fall, wenn Sie eine ordnungsgemäß erstellte Fehlerunterklasse verwenden. Um Ihre eigene ErrorX Error-Unterklasse zu erstellen, kopieren Sie einfach den Codeblock, der mit "var MyError =" beginnt, und ändern Sie das eine Wort "MyError" in "ErrorX". (Wenn Sie Ihrer Unterklasse benutzerdefinierte Methoden hinzufügen möchten, folgen Sie dem Beispieltext.)
Die eigentliche und wesentliche Einschränkung der JavaScript-Fehlerunterklasse besteht darin, dass bei JavaScript-Implementierungen oder -Debuggern, die die Stapelverfolgung und den Ort der Instanziierung verfolgen und darüber berichten, wie FireFox, ein Ort in Ihrer eigenen Fehlerunterklassenimplementierung als Instanziierungspunkt der aufgezeichnet wird Wenn Sie einen direkten Fehler verwenden, ist dies der Ort, an dem Sie "new Error (...)" ausgeführt haben. IE-Benutzer würden es wahrscheinlich nie bemerken, aber Benutzer von Fire Bug auf FF werden nutzlose Dateinamen- und Zeilennummernwerte sehen, die neben diesen Fehlern gemeldet werden, und müssen einen Drilldown auf dem Stack-Trace zu Element 1 durchführen, um den tatsächlichen Instanziierungsspeicherort zu finden.
quelle
Crescent Fresh's
sie gelöscht wurde!Wie wäre es mit dieser Lösung?
Anstatt Ihren benutzerdefinierten Fehler zu werfen, verwenden Sie:
Sie würden das Fehlerobjekt einschließen (ähnlich wie ein Dekorateur):
Dadurch wird sichergestellt, dass alle Attribute korrekt sind, z. B. der Stapel, der Dateiname, die Zeilennummer usw.
Alles, was Sie dann tun müssen, ist entweder über die Attribute zu kopieren oder Getter für sie zu definieren. Hier ist ein Beispiel mit Getter (IE9):
quelle
new MyErr (arg1, arg2, new Error())
und im MyErr-Konstruktor verwenden wirObject.assign
, um die Eigenschaften des letzten Args zuzuweisenthis
Wie einige Leute gesagt haben, ist es mit ES6 ziemlich einfach:
Also habe ich das in meiner App (Angular, Typescript) versucht und es hat einfach nicht funktioniert. Nach einiger Zeit habe ich festgestellt, dass das Problem von Typescript stammt: O.
Siehe https://github.com/Microsoft/TypeScript/issues/13965
Es ist sehr beunruhigend, denn wenn Sie dies tun:
Im Knoten oder direkt in Ihrem Browser wird Folgendes angezeigt:
Custom error
Versuchen Sie, das mit Typescript in Ihrem Projekt auf dem Typescript-Spielplatz auszuführen, es wird angezeigt
Basic error
...Die Lösung besteht darin, Folgendes zu tun:
quelle
Meine Lösung ist einfacher als die anderen Antworten und hat keine Nachteile.
Die Fehlerprototypkette und alle Eigenschaften von Error bleiben erhalten, ohne dass spezielle Kenntnisse erforderlich sind. Es wurde in Chrome, Firefox, Node und IE11 getestet.
Die einzige Einschränkung ist ein zusätzlicher Eintrag oben im Aufrufstapel. Das wird aber leicht ignoriert.
Hier ist ein Beispiel mit zwei benutzerdefinierten Parametern:
Anwendungsbeispiel:
Für Umgebungen, die eine Polydatei von setPrototypeOf erfordern:
quelle
throw CustomError('err')
anstelle vonthrow new CustomError('err')
Im obigen Beispiel tut
Error.apply
(auchError.call
) nichts für mich (Firefox 3.6 / Chrome 5). Eine Problemumgehung, die ich verwende, ist:quelle
In Node ist es, wie andere gesagt haben, einfach:
quelle
Ich möchte nur hinzufügen, was andere bereits gesagt haben:
Um sicherzustellen, dass die benutzerdefinierte Fehlerklasse ordnungsgemäß im Stack-Trace angezeigt wird, müssen Sie die Namenseigenschaft des Prototyps der benutzerdefinierten Fehlerklasse auf die Namenseigenschaft der benutzerdefinierten Fehlerklasse festlegen. Das ist was ich meine:
Das vollständige Beispiel wäre also:
Wenn alles gesagt und getan ist, werfen Sie Ihre neue Ausnahme und es sieht so aus (ich habe dies in den Chrome Dev Tools faul versucht):
quelle
Meine 2 Cent:
Warum noch eine Antwort?
a) Weil der Zugriff auf die
Error.stack
Immobilie (wie in einigen Antworten) eine große Leistungsminderung mit sich bringt.b) Weil es nur eine Zeile ist.
c) Da die Lösung unter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error keine Stapelinformationen zu speichern scheint.
Anwendungsbeispiel
http://jsfiddle.net/luciotato/xXyeB/
Was tut es?
this.__proto__.__proto__
istMyError.prototype.__proto__
, also setzt es__proto__
FOR ALL INSTANCES von MyError auf einen bestimmten neu erstellten Fehler. Es behält die Eigenschaften und Methoden der MyError-Klasse bei und fügt auch die neuen Fehlereigenschaften (einschließlich .stack) in die__proto__
Kette ein.Offensichtliches Problem:
Sie können nicht mehr als eine Instanz von MyError mit nützlichen Stapelinformationen haben.
Verwenden Sie diese Lösung nicht, wenn Sie nicht vollständig verstehen, was
this.__proto__.__proto__=
funktioniert.quelle
Da JavaScript-Ausnahmen schwer zu unterklassifizieren sind, unterteile ich sie nicht. Ich erstelle gerade eine neue Ausnahmeklasse und verwende einen Fehler darin. Ich ändere die Eigenschaft Error.name so, dass sie wie meine benutzerdefinierte Ausnahme auf der Konsole aussieht:
Die obige neue Ausnahme kann wie ein regulärer Fehler ausgelöst werden und funktioniert wie erwartet, zum Beispiel:
Vorsichtsmaßnahme: Die Stapelverfolgung ist nicht perfekt, da sie Sie dorthin bringt, wo der neue Fehler erstellt wurde und nicht dorthin, wo Sie werfen. Dies ist in Chrome keine große Sache, da Sie einen vollständigen Stack-Trace direkt in der Konsole erhalten. Bei Firefox ist dies jedoch problematischer.
quelle
m = new InvalidInputError(); dontThrowMeYet(m);
m = new ...
dannPromise.reject(m)
. Es ist keine Notwendigkeit, aber der Code ist leichter zu lesen.Wie in Mohsens Antwort ausgeführt, ist es in ES6 möglich, Fehler mithilfe von Klassen zu erweitern. Es ist viel einfacher und ihr Verhalten ist konsistenter mit nativen Fehlern ... aber leider ist es nicht einfach, dies im Browser zu verwenden, wenn Sie Browser vor ES6 unterstützen müssen. Im Folgenden finden Sie einige Hinweise, wie dies implementiert werden könnte. In der Zwischenzeit schlage ich jedoch einen relativ einfachen Ansatz vor, der einige der besten Vorschläge aus anderen Antworten enthält:
In ES6 ist es so einfach wie:
... und Sie können Unterstützung für ES6-Klassen mit erkennen
try {eval('class X{}')
, aber Sie erhalten einen Syntaxfehler, wenn Sie versuchen, die ES6-Version in ein Skript aufzunehmen, das von älteren Browsern geladen wird. Die einzige Möglichkeit, alle Browser zu unterstützen, besteht darin, ein separates Skript dynamisch (z. B. über AJAX odereval()
) für Browser zu laden , die ES6 unterstützen. Eine weitere Komplikation besteht darin, dasseval()
nicht in allen Umgebungen (aufgrund von Inhaltssicherheitsrichtlinien) unterstützt wird, was für Ihr Projekt möglicherweise eine Überlegung darstellt oder nicht.Im
Error
Moment scheint entweder der erste Ansatz oben oder die direkte Verwendung ohne den Versuch, ihn zu erweitern, der beste zu sein, der praktisch für Code durchgeführt werden kann, der Nicht-ES6-Browser unterstützen muss.Es gibt einen anderen Ansatz, den einige Leute in Betracht ziehen könnten, nämlich,
Object.setPrototypeOf()
wo verfügbar, ein Fehlerobjekt zu erstellen, das eine Instanz Ihres benutzerdefinierten Fehlertyps ist, das jedoch eher wie ein nativer Fehler in der Konsole aussieht und sich verhält (dank Bens Antwort) für die Empfehlung). Hier ist meine Meinung zu diesem Ansatz: https://gist.github.com/mbrowne/fe45db61cea7858d11be933a998926a8 . Angesichts der Tatsache, dass wir eines Tages nur ES6 verwenden können, bin ich mir persönlich nicht sicher, ob sich die Komplexität dieses Ansatzes lohnt.quelle
Der Weg, dies richtig zu machen, besteht darin, das Ergebnis der Anwendung vom Konstruktor zurückzugeben und den Prototyp auf die übliche komplizierte Javascripty-Weise zu setzen:
Die einzigen Probleme mit dieser Art, es an diesem Punkt zu tun (ich habe es ein bisschen wiederholt), sind das
stack
undmessage
sind nicht inMyError
und enthaltenDas erste Problem könnte behoben werden, indem alle nicht aufzählbaren Fehlereigenschaften mit dem Trick in dieser Antwort durchlaufen werden: Ist es möglich, die nicht aufzählbaren geerbten Eigenschaftsnamen eines Objekts abzurufen? , aber dies wird nicht von dh <9 unterstützt. Das zweite Problem könnte gelöst werden, indem diese Zeile in der Stapelverfolgung herausgerissen wird, aber ich bin mir nicht sicher, wie ich das sicher tun soll (vielleicht nur die zweite Zeile von e.stack.toString () entfernen ??).
quelle
Das Snippet zeigt alles.
quelle
Ich würde einen Schritt zurücktreten und überlegen, warum Sie das tun wollen. Ich denke, es geht darum, mit verschiedenen Fehlern unterschiedlich umzugehen.
In Python können Sie beispielsweise die catch-Anweisung auf nur catch beschränken
MyValidationError
, und möglicherweise möchten Sie in Javascript etwas Ähnliches tun können.Sie können dies nicht in Javascript tun. Es wird nur einen Fangblock geben. Sie sollten eine if-Anweisung für den Fehler verwenden, um seinen Typ zu bestimmen.
catch(e) { if(isMyValidationError(e)) { ... } else { // maybe rethrow? throw e; } }
Ich denke, ich würde stattdessen ein Rohobjekt mit einem Typ, einer Nachricht und anderen Eigenschaften werfen, die Sie für richtig halten.
Und wenn Sie den Fehler bemerken:
quelle
error.stack
, Standardwerkzeuge funktionieren nicht damit usw. usw. Ein besserer Weg wäre, einer Fehlerinstanz Eigenschaften hinzuzufügen, z. B.var e = new Error(); e.type = "validation"; ...
Benutzerdefinierter Fehlerdekorateur
Dies basiert auf der Antwort von George Bailey , erweitert und vereinfacht jedoch die ursprüngliche Idee. Es ist in CoffeeScript geschrieben, lässt sich aber leicht in JavaScript konvertieren. Die Idee ist, Baileys benutzerdefinierten Fehler um einen Dekorateur zu erweitern, der ihn umschließt, sodass Sie problemlos neue benutzerdefinierte Fehler erstellen können.
Hinweis: Dies funktioniert nur in V8.
Error.captureStackTrace
In anderen Umgebungen gibt es keine Unterstützung .Definieren
Der Dekorateur nimmt einen Namen für den Fehlertyp und gibt eine Funktion zurück, die eine Fehlermeldung entgegennimmt und den Fehlernamen einschließt.
Verwenden
Jetzt ist es einfach, neue Fehlertypen zu erstellen.
Zum Spaß können Sie jetzt eine Funktion definieren, die a auslöst,
SignatureError
wenn sie mit zu vielen Argumenten aufgerufen wird.Dies wurde ziemlich gut getestet und scheint auf V8 perfekt zu funktionieren, wobei Traceback, Position usw. beibehalten werden.
Hinweis: Die Verwendung
new
ist optional, wenn ein benutzerdefinierter Fehler erstellt wird.quelle
Wenn Sie sich nicht für die Leistung bei Fehlern interessieren, ist dies die kleinste, die Sie tun können
Sie können es ohne neuen nur MyError (Nachricht) verwenden
Durch Ändern des Prototyps nach dem Aufrufen des Konstruktorfehlers müssen Callstack und Nachricht nicht festgelegt werden
quelle
Mohsen hat oben in ES6 eine großartige Antwort, die den Namen festlegt, aber wenn Sie TypeScript verwenden oder in der Zukunft leben, in der dieser Vorschlag für öffentliche und private Klassenfelder hoffentlich als Vorschlag über Stufe 3 hinausgegangen ist und ihn gemacht hat Wenn Sie als Teil von ECMAScript / JavaScript in Stufe 4 eintreten, möchten Sie vielleicht wissen, dass dies nur ein bisschen kürzer ist. In Phase 3 beginnen Browser mit der Implementierung von Funktionen. Wenn Ihr Browser dies unterstützt, funktioniert der folgende Code möglicherweise. (Getestet im neuen Edge-Browser v81 scheint es gut zu funktionieren). Seien Sie gewarnt, obwohl dies im Moment eine instabile Funktion ist und vorsichtig verwendet werden sollte. Sie sollten die Browserunterstützung immer auf instabile Funktionen überprüfen. Dieser Beitrag richtet sich hauptsächlich an zukünftige Bewohner, die dies möglicherweise von Browsern unterstützen. Um den Support zu überprüfen, überprüfen Sie MDNundKann ich verwenden . Derzeit wird der Browser-Markt zu 66% unterstützt, was jedoch nicht so gut ist. Wenn Sie ihn jetzt wirklich verwenden möchten und nicht warten möchten, verwenden Sie entweder einen Transpiler wie Babel oder etwas wie TypeScript .
Vergleichen Sie dies mit einem namenlosen Fehler, der beim Auslösen seinen Namen nicht protokolliert.
quelle