The catch()
method returns a Promise
and deals with rejected cases only. It behaves the same as calling Promise.prototype.then(undefined, onRejected)
(in fact, calling obj.catch(onRejected)
internally calls obj.then(undefined, onRejected)
). This means that you have to provide an onRejected
function even if you want to fall back to an undefined
result value - for example obj.catch(() => {})
.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
p.catch(onRejected);p.catch(function(reason) { // rejection});
Parameters
onRejected
- A
Function
called when thePromise
is rejected. This function has one argument:reason
- The rejection reason.
catch()
is rejected ifonRejected
throws an error or returns a Promise which is itself rejected; otherwise, it is resolved.
Return value
Internally calls Promise.prototype.then
on the object upon which it was called, passing the parameters undefined
and the received onRejected
handler. Returns the value of that call, which is a Promise
.
Note the examples below are throwing instances of Error. This is considered good practice in contrast to throwing Strings; otherwise, the part doing the catching would have to perform checks to see if the argument was a string or an error, and you might lose valuable information like stack traces.
Demonstration of the internal call:
// overriding original Promise.prototype.then/catch just to add some logs(function(Promise){ var originalThen = Promise.prototype.then; var originalCatch = Promise.prototype.catch; Promise.prototype.then = function(){ console.log('> > > > > > called .then on %o with arguments: %o', this, arguments); return originalThen.apply(this, arguments); }; Promise.prototype.catch = function(){ console.error('> > > > > > called .catch on %o with arguments: %o', this, arguments); return originalCatch.apply(this, arguments); };})(this.Promise);// calling catch on an already resolved promisePromise.resolve().catch(function XXX(){});// logs:// > > > > > > called .catch on Promise{} with arguments: Arguments{1} [0: function XXX()]// > > > > > > called .then on Promise{} with arguments: Arguments{2} [0: undefined, 1: function XXX()]
Description
The catch
method is used for error handling in promise composition. Since it returns a Promise
, it can be chained in the same way as its sister method, then()
.
Examples
Using and chaining the catch
method
var p1 = new Promise(function(resolve, reject) { resolve('Success');});p1.then(function(value) { console.log(value); // "Success!" throw new Error('oh, no!');}).catch(function(e) { console.error(e.message); // "oh, no!"}).then(function(){ console.log('after a catch the chain is restored');}, function () { console.log('Not fired due to the catch');});// The following behaves the same as abovep1.then(function(value) { console.log(value); // "Success!" return Promise.reject('oh, no!');}).catch(function(e) { console.error(e); // "oh, no!"}).then(function(){ console.log('after a catch the chain is restored');}, function () { console.log('Not fired due to the catch');});
Gotchas when throwing errors
// Throwing an error will call the catch method most of the timevar p1 = new Promise(function(resolve, reject) { throw new Error('Uh-oh!');});p1.catch(function(e) { console.error(e); // "Uh-oh!"});// Errors thrown inside asynchronous functions will act like uncaught errorsvar p2 = new Promise(function(resolve, reject) { setTimeout(function() { throw new Error('Uncaught Exception!'); }, 1000);});p2.catch(function(e) { console.error(e); // This is never called});// Errors thrown after resolve is called will be silencedvar p3 = new Promise(function(resolve, reject) { resolve(); throw new Error('Silenced Exception!');});p3.catch(function(e) { console.error(e); // This is never called});
If it is resolved
//Create a promise which would not call onRejectvar p1 = Promise.resolve("calling next");var p2 = p1.catch(function (reason) { //This is never called console.error("catch p1!"); console.error(reason);});p2.then(function (value) { console.log("next promise's onFulfilled"); /* next promise's onFulfilled */ console.log(value); /* calling next */}, function (reason) { console.log("next promise's onRejected"); console.log(reason);});
Specifications
Specification |
---|
ECMAScript (ECMA-262) The definition of 'Promise.prototype.catch' in that specification. |
Browser compatibility
To contribute to this compatibility data, please write a pull request against this repository: https://github.com/mdn/browser-compat-data.
Desktop | Mobile | Server | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
catch() | Chrome Full support 32 | Edge Full support 12 | Firefox Full support 29 | IE No support No | Opera Full support 19 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 32 | Firefox Android Full support 29 | Opera Android Full support 19 | Safari iOS Full support 8 | Samsung Internet Android Full support 2.0 | nodejs Full support 0.12 |
Legend
- Full support
- Full support
- No support
- No support