Monday, May 20, 2024
47
rated 0 times [  50] [ 3]  / answers: 1 / hits: 62314  / 8 Years ago, thu, march 31, 2016, 12:00:00

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?


More From » error-handling

 Answers
8

A good option is to use the constructor property of the object:


// on reject / failure
switch (error.constructor) {
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);
}

Notice that the constructor must match exactly with the one that object was created (suppose error is an instance of NotAllowedError and NotAllowedError is a subclass of Error):



  • error.constructor === NotAllowedError is true

  • error.constructor === Error is false


This makes a difference from instanceof, which can match also the super class:



  • error instanceof NotAllowedError is true

  • error instanceof Error is true


Check this interesting post about constructor property.


[#62744] Tuesday, March 29, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
elijahm

Total Points: 674
Total Questions: 124
Total Answers: 79

Location: Northern Mariana Islands
Member since Fri, Jan 15, 2021
3 Years ago
;