--- title: Promise.prototype.catch() slug: Web/JavaScript/Reference/Global_Objects/Promise/catch translation_of: Web/JavaScript/Reference/Global_Objects/Promise/catch ---
obj.catch(onRejected)
internamente é chamado obj.then(undefined, onRejected)
).p.catch(onRejected); p.catch(function(motivo) { // rejeição });
Promise
é rejeitada. Esta função possui um argumento:catch()
é rejeitada apenas se onRejected
cospe um erro ou se o o retorno da Promise foi rejeitada por si mesmo, ou seja, foi resolvida.Internamente chamamos Promise.prototype.then
sobre o objeto que é chamando passando parâmetros como undefined
e onRejected
no manipulador de eventos. Então retornamos o valor da chamada que é {{jsxref("Promise")}}.
O exemplo abaixo está cuspindo uma string. Isso é considerado uma má prática. Sempre cuspir uma instance de erro (Error). Em todo caso, a parte que faz a captura deve fazer verificaçoes sobre os argumentos para saber se é uma string ou um erro e você poderá perder informações valiosas como stack traces.
Demonstração de uma camada interna:
// Sobrescrevendo o techo original de Promise.prototype.then/catch adicionando alguns logs (function(Promise){ var originalThen = Promise.prototype.then; var originalCatch = Promise.prototype.catch; Promise.prototype.then = function(){ console.log('> > > > > > chamando .then em %o com argumentos: %o', this, arguments); return originalThen.apply(this, arguments); }; Promise.prototype.catch = function(){ console.log('> > > > > > chamando .catch em %o com argumentos: %o', this, arguments); return originalCatch.apply(this, arguments); }; })(this.Promise); // chamando um catch em uma Promise já resolvida. Promise.resolve().catch(function XXX(){}); // logs: // > > > > > > chamando .catch na Promise{} com os argumentos: Arguments{1} [0: function XXX()] // > > > > > > chamando .then na Promise{} com os argumentos: Arguments{2} [0: undefined, 1: function XXX()]
O método catch
pode ser útil para manipulação de erros na composição da sua promise.
catch
var p1 = new Promise(function(resolve, reject) { resolve('Sucesso'); }); p1.then(function(value) { console.log(value); // "Sucesso!" throw 'Ah, não!'; }).catch(function(e) { console.log(e); // "Ah, não!" }).then(function(){ console.log('Após um catch, a sequencia é restaurada'); }, function () { console.log('Não engatilhado devido ao catch'); }); // O seguinte se comporta da mesma maneira que o anterior p1.then(function(value) { console.log(value); // "Sucesso!" return Promise.reject('Ah, não!'); }).catch(function(e) { console.log(e); // "Ah, não!" }).then(function(){ console.log('Após um catch, a sequencia é restaurada'); }, function () { console.log('Não engatilhado devido ao catch'); });
Especificação | Status | Comentário |
---|---|---|
{{SpecName('ES6', '#sec-promise.prototype.catch', 'Promise.prototype.catch')}} | {{Spec2('ES6')}} | Initial definition in an ECMA standard. |
{{SpecName('ESDraft', '#sec-promise.prototype.catch', 'Promise.prototype.catch')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Promise.catch")}}