I use custom errors (es6-error) allowing me to handle errors based on their class like 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);
};
}
Now I'd rather use a switch for this type of flow, resulting in something like:
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 doesn't work like that however. So the latter fails.
Is there any way to check an instance for its class in a switch statement?
An alternative to this switch case is to just have a status field in the Error's constructor.
For Example, build your error like so:
Handle your error like so:
Workaround, to avoid if-else. Found here
A good option is to use the
constructor
property of the object:Notice that the
constructor
must match exactly with the one that object was created (supposeerror
is an instance ofNotAllowedError
andNotAllowedError
is a subclass ofError
):error.constructor === NotAllowedError
istrue
error.constructor === Error
isfalse
This makes a difference from
instanceof
, which can match also the super class:error instanceof NotAllowedError
istrue
error instanceof Error
istrue
Check this interesting post about
constructor
property.