Wie verwenden von instanceof in einer switch-Anweisung
Ich verwende benutzerdefinierte Fehler ( es6-Fehler ), die mir erlaubt, um Fehler zu behandeln, basierend auf Ihrer Klasse so:
import { DatabaseEntryNotFoundError, NotAllowedError } from 'customError';
function fooRoute(req, res) {
doSomethingAsync()
.then(() => {
//on resolve /success
return res.send(200);
})
.catch((error) => {
//on reject /failure
if (error instanceof DatabaseEntryNotFoundError) {
return res.send(404);
} else if (error instanceof NotAllowedError) {
return res.send(400);
}
log('Failed to do something async with an unspecified error: ', error);
return res.send(500);
};
}
Nun, ich würde lieber einen Schalter für diese Art von flow, was in etwas wie:
import { DatabaseEntryNotFoundError, NotAllowedError } from 'customError';
function fooRoute(req, res) {
doSomethingAsync()
.then(() => {
//on resolve /success
return res.send(200);
})
.catch((error) => {
//on reject /failure
switch (error instanceof) {
case NotAllowedError:
return res.send(400);
case DatabaseEntryNotFoundError:
return res.send(404);
default:
log('Failed to do something async with an unspecified error: ', error);
return res.send(500);
}
});
}
instanceof nicht wie das funktioniert aber. Also dieser ausfällt.
Gibt es eine Möglichkeit zu überprüfen, die eine Instanz Ihrer Klasse in einer switch-Anweisung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine gute Möglichkeit ist die Verwendung des
constructor
Eigenschaft des Objekts:Beachten Sie, dass die
constructor
muss genau übereinstimmen mit der man das Objekt erstellt wurde (nehmeerror
ist eine Instanz vonNotAllowedError
undNotAllowedError
ist eine Unterklasse vonError
):error.constructor === NotAllowedError
isttrue
error.constructor === Error
istfalse
Das macht den Unterschied aus
instanceof
, die passen auch super Klasse:error instanceof NotAllowedError
isttrue
error instanceof Error
isttrue
Überprüfen diesen interessanten Beitrag über
constructor
Eigenschaft.Problemumgehung, um zu vermeiden, if-else. Gefunden hier
Alternative zu diesem switch case ist einfach nur ein status-Feld in dem Error-Konstruktor.
Zum Beispiel, bauen Sie Ihre Fehler so:
Griff Ihre Fehler-wie so:
NotAllowed
Fehler die Funktion wirft den Fehler jetzt braucht, um den Unterschied zu verstehen und werfen Sie die richtigenNotAllowedError
.doSomethingAsync
wissen nichts über das, was ruft es. Da es den Fehler auslöst, und die Art und Weise derfooRoute
funktioniert, hängt davon ab, was in der Fehlermeldung,doSomethingAsync
jetzt möglicherweise muss sich bewusst sein, wiefooRoute
arbeitet, um zu werfen den Fehler mit der richtigen status-code. Sie würden zusammengebunden werden.