In JS scheint es nicht möglich zu sein, zu überprüfen, ob ein an eine Funktion übergebenes Argument tatsächlich vom Typ 'error' oder eine Instanz von Error ist.
Dies ist beispielsweise nicht gültig:
typeof err === 'error'
da es nur 6 mögliche Typen gibt (in Form von Strings):
Der Operator typeof gibt Typinformationen als Zeichenfolge zurück. Es gibt sechs mögliche Werte, die typeof
zurückgegeben werden:
"number", "string", "boolean", "object", "function" und "undefined".
Aber was ist, wenn ich einen einfachen Anwendungsfall wie diesen habe:
function errorHandler(err) {
if (typeof err === 'error') {
throw err;
}
else {
console.error('Unexpectedly, no error was passed to error handler. But here is the message:',err);
}
}
Was ist der beste Weg, um festzustellen, ob ein Argument eine Fehlerinstanz ist?
ist der instanceof
Betreiber irgendeine Hilfe?
javascript
node.js
Alexander Mills
quelle
quelle
err instanceof Error
err
(sagen), ihn dann aber zur Übergabe an das übergeordnete Fenster übergeben(err instanceof Error) === false
. Dies liegt daran, dass der Iframe und sein übergeordnetes Fenster unterschiedlicheError
Objektprototypen haben. In ähnlicher Weise wird ein Objekt wieobj = {};
will, wenn es an eine Funktion übergeben wird, die in einem anderen Fenster ausgeführt wird, yeild(obj instanceof Object)===false
. (Selbst im schlimmsten Fall, wenn Sie im IE einen Verweis auf obj behalten, nachdem sein Fenster zerstört oder navigiert wurde, wird der Versuch, Objektprototyp-Fns wie aufzurufenobj.hasOwnProperty()
, Fehler auslösen !)catch((err)=>{if (err === ENOENT)
gibtENOENT is not defined
Fehler zurück?Antworten:
Sie können den
instanceof
Operator verwenden (siehe jedoch die Einschränkung unten!).Das Obige funktioniert nicht, wenn der Fehler in einem anderen Fenster / Frame / Iframe ausgelöst wurde als dort, wo die Überprüfung stattfindet. In diesem Fall gibt die
instanceof Error
Prüfung auch für einError
Objekt false zurück . In diesem Fall ist das Enten-Tippen der einfachste Ansatz.Allerdings Ente-Eingabe erzeugen kann zu Fehlalarmen kommen, wenn Sie nicht-Fehler - Objekte haben , die enthalten
stack
undmessage
Eigenschaften.quelle
ReferenceError
Instanz. Sie überprüfen das globaleReferenceError
Objekt. Versuchentry { foo } catch (e) { console.log(e instanceof Error) }
Sie Folgendes : Es wird protokollierttrue
. Wenn Sie versuchen, das globaleReferenceError
Objekt aus irgendeinem Grund zu überprüfen , können SieError.isPrototypeOf(ReferenceError)
ReferenceError
Instanzen keine Instanzen warenError
. Dies war auf einen Aufruf vonvm.runInNewContext()
in node zurückzuführen, bei dem alle Standardprototypen neu definiert werden. Alle meine Ergebnisse waren keine Instanzen von Standardobjekten. Ich habe in SO darüber gesucht und bin in diesen Thread gefallen :)const error = (err instanceof Error || err instanceof TypeError) ? err : new Error(err.message ? err.message : err);
instanceof
eine bestimmte Art von Fehler handelt?Ich habe die ursprüngliche Frage gestellt - @ Trotts Antwort ist sicherlich die beste.
Da JS jedoch eine dynamische Sprache ist und es so viele JS-Laufzeitumgebungen gibt, kann der
instanceof
Operator insbesondere bei der Front-End-Entwicklung fehlschlagen, wenn Grenzen wie Iframes überschritten werden. Siehe: https://github.com/mrdoob/three.js/issues/5886Wenn Sie mit dem Tippen von Enten einverstanden sind, sollte dies gut sein:
Ich persönlich bevorzuge statisch typisierte Sprachen, aber wenn Sie eine dynamische Sprache verwenden, ist es am besten, eine dynamische Sprache als das zu akzeptieren, was sie ist, anstatt sie zu zwingen, sich wie eine statisch typisierte Sprache zu verhalten.
Wenn Sie etwas genauer werden möchten, können Sie dies tun:
quelle
instanceof
Operator in einigen Fällen ausfällt. Weitere Informationen finden Sie im verlinkten Artikel.Error
,ReferenceError
...). Und in meiner Umgebunginstanceof
scheitert das unter vielen Umständen kläglich.Das einzige Problem dabei ist
Eine Alternative dazu wäre die Verwendung der Konstruktoreigenschaft.
Obwohl zu beachten ist, dass diese Übereinstimmung sehr spezifisch ist, zum Beispiel:
quelle
Sie können
Object.prototype.toString
damit leicht überprüfen, ob es sich bei einem Objekt um ein Objekt handeltError
, das auch für verschiedene Frames funktioniert.quelle
Mit obj.constructor.name können Sie die "Klasse" eines Objekts https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Function_names_in_classes überprüfen
Beispielsweise
In der obigen Zeile wird "Fehler" protokolliert, der der Klassenname des Objekts ist. Dies kann mit allen Klassen in Javascript verwendet werden, wenn die Klasse keine Eigenschaft verwendet, die den Namen "name" trägt.
quelle
Vielen Dank an @Trott für Ihren Code. Ich habe nur denselben Code verwendet und ein Echtzeit-Arbeitsbeispiel zum Nutzen anderer hinzugefügt.
quelle
Oder verwenden Sie dies für verschiedene Arten von Fehlern
quelle