Tratando Erros em Promises - JavaScript
Um dos benefícios das promises é a maneira mais simples de lidar com erros. Para capturar e tratar um erro, podemos utilizar a função catch()
Promise
const myPromise = new Promise(function(resolve, reject) {
console.log("Executando operação assíncrona");
reject("Dados incorretos");
});
myPromise.catch(function(error) {
console.log(error);
});
A função catch()
reject()
Saída do Console:
Executando operação assíncrona Dados incorretos
Lançando Erros
Anteriormente, a função reject()
reject()
getSomeWork()
const myPromise = new Promise(function(resolve) {
console.log("Executando operação assíncrona");
getSomeWork(); // chamada de uma função não existente
resolve("Hello world!");
});
myPromise.catch(function(error) {
console.log(error);
});
Como a função getSomeWork()
resolve("Hello world!")
catch()
error
Executando operação assíncrona Uncaught ReferenceError: getSomeWork is not defined at Promise (index.html:10) at new Promise (<anonymous>) at index.html:9
throw
O erro também pode ser resultado do uso do operador throw, que lança um erro:
const myPromise = new Promise(function(resolve, reject) {
console.log("Executando operação assíncrona");
const parsed = parseInt("Hello");
if (isNaN(parsed)) {
throw "Not a number"; // Lança um erro
}
resolve(parsed);
});
myPromise.catch(function(error) {
console.log(error);
});
Aqui, uma string aleatória é convertida em número. Se o resultado da conversão não for um número, um erro é lançado usando o operador throw
catch
Executando operação assíncrona Not a number
Neste caso, a função manipuladora recebe a mensagem de erro especificada após o operador throw
Esta situação pode parecer artificial, pois não há razão para lançar um erro usando throw
reject
if (isNaN(parsed)) {
reject("Not a number");
}
No entanto, o operador throw
function getNumber(str) {
const parsed = parseInt(str);
if (isNaN(parsed)) throw "Not a number"; // Lança um erro
else return parsed;
}
const myPromise = new Promise(function(resolve) {
console.log("Executando operação assíncrona");
const result = getNumber("hello");
resolve(result);
});
myPromise.catch(function(error) {
console.log(error);
});
Aqui, a conversão de uma string em número é realizada em uma função externa, getNumber
throw
catch()
try..catch
Assim como em casos gerais, operações que podem lançar erros podem ser colocadas dentro de uma estrutura try
catch
catch
reject()
const myPromise = new Promise(function(resolve, reject) {
try {
console.log("Executando operação assíncrona");
getSomeWork(); // chamada de uma função não existente
resolve("Hello world!");
}
catch(err) {
reject(`Ocorreu um erro: ${err.message}`);
}
});
myPromise.catch(function(error) {
console.log(error);
});
Saída do Console:
Executando operação assíncrona Ocorreu um erro: getSomeWork is not defined
Tratando Erros Usando then
Além da função catch
then()
then()
reject()
promise
.then(function(value) {
// obtenção do valor
},
function(error) {
// tratamento do erro
});
O segundo parâmetro da função then()
reject()
Exemplo:
function generateNumber(str) {
return new Promise(function(resolve, reject) {
const parsed = parseInt(str);
if (isNaN(parsed)) reject("o valor não é um número")
else resolve(parsed);
})
.then(function(value) { console.log("Resultado da operação:", value); },
function(error) { console.log("Ocorreu um erro:", error); });
}
generateNumber("23");
generateNumber("hello");
Neste caso, para permitir a passagem de diferentes dados ao promise, ele é definido como o resultado retornado pela função generateNumber()
Resultado da operação: 23 Ocorreu um erro: o valor não é um número