.catch is a method from Promise API for handling errors in promise chains. Native promises support only catch-all functionality similar to the synchronous catch(e) { ... } block. You need to explicitly check error's type using instanceof and if/else statements.
somePromise.then(() => someActionWhichThrows)
.catch(error => {
if (error instanceof TypeError) {
// handle TypeError
} else if (error instanceof RangeError) {
// handle RangeError
} else {
// handle other errors
}
})Bluebird, however, introduces a .catch variant which allows to filter specific errors directly. Note that each .catch handler can accept more than one error.
somePromise.then(() => someActionWhichThrows)
.catch(TypeError, ReferenceError, error => {
// catch & handle TypeError or ReferenceError
})
.catch(NetworkError, TimeoutError, error => {
// catch & handle NetworkError or TimeoutError
})
.catch(error => {
// catch & handle other errors
});The .catch parameter is considered to be an error if its .prototype property is an instanceof Error, e.g.
function CustomError(message = "") {
this.name = "NotImplementedError";
this.message = message;
}
CustomError.prototype = Object.create(Error.prototype);In order to also have the stack traces included, the above example needs to be slightly modified, i.e.
function CustomError(message = "") {
this.name = "NotImplementedError";
this.message = message;
Error.captureStackTrace(this, CustomError);
}
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;