Resumo : neste tutorial você aprenderá como lidar com tratamento de erros em promessas.
Suponha que você tenha uma função chamada getUserById()
que retorne uma Promise :
function getUserById(id) {
return new Promise((resolve, reject) => {
resolve({
id: id,
username: 'admin'
});
});
}
Linguagem de código: JavaScript ( javascript )
Erro normal
Primeiro, altere a getUserById()
função para gerar um erro fora da promessa:
function getUserById(id) {
if (typeof id !== 'number' || id <= 0) {
throw new Error('Invalid id argument');
}
return new Promise((resolve, reject) => {
resolve({
id: id,
username: 'admin'
});
});
}
Linguagem de código: JavaScript ( javascript )
Segundo, lide com a promessa usando os métodos then()
e catch()
:
getUserById('a')
.then(user => console.log(user.username))
.catch(err => console.log(err));
Linguagem de código: JavaScript ( javascript )
O código gera um erro:
Uncaught Error: Invalid id argument
Linguagem de código: JavaScript ( javascript )
Ao levantar uma exceção fora da promessa, você deve capturá-la com try/catch
:
try {
getUserById('a')
.then(user => console.log(user.username))
.catch(err => console.log(`Caught by .catch ${err}`));
} catch (error) {
console.log(`Caught by try/catch ${error}`);
}
Linguagem de código: JavaScript ( javascript )
Saída:
Caught by try/catch Error: Invalid id argument
Linguagem de código: JavaScript ( javascript )
Erros dentro das promessas
Mudamos a getUserById()
função para gerar um erro dentro da promessa:
let authorized = false;
function getUserById(id) {
return new Promise((resolve, reject) => {
if (!authorized) {
throw new Error('Unauthorized access to the user data');
}
resolve({
id: id,
username: 'admin'
});
});
}
Linguagem de código: JavaScript ( javascript )
E consuma a promessa:
try {
getUserById(10)
.then(user => console.log(user.username))
.catch(err => console.log(`Caught by .catch ${err}`));
} catch (error) {
console.log(`Caught by try/catch ${error}`);
}
Linguagem de código: JavaScript ( javascript )
Saída:
Caught by .catch Error: Unauthorized access to the user data
Linguagem de código: JavaScript ( javascript )
Se você lançar um erro dentro da promessa, o catch()
método irá capturá-lo, não o try/catch.
Se você encadear promessas, o método catch() detectará erros que ocorrem em qualquer promessa. Por exemplo:
promise1
.then(promise2)
.then(promise3)
.then(promise4)
.catch(err => console.log(err));
Linguagem de código: JavaScript ( javascript )
Neste exemplo, se houver algum erro na promessa1, promessa2 ou promessa4, o catch()
método irá tratá-lo.
reject()
Função de chamada
Lançar um erro tem o mesmo efeito que chamar the reject()
conforme ilustrado no exemplo a seguir:
let authorized = false;
function getUserById(id) {
return new Promise((resolve, reject) => {
if (!authorized) {
reject('Unauthorized access to the user data');
}
resolve({
id: id,
username: 'admin'
});
});
}
try {
getUserById(10)
.then(user => console.log(user.username))
.catch(err => console.log(`Caught by .catch ${err}`));
} catch (error) {
console.log(`Caught by try/catch ${error}`);
}
Linguagem de código: JavaScript ( javascript )
Neste exemplo, em vez de lançar um erro dentro da promessa, chamamos reject()
explicitamente. O catch()
método também trata o erro neste caso.
Falta o método catch()
O exemplo a seguir não fornece o catch()
método para tratar o erro dentro da promessa. Isso causará um erro de execução e encerrará o programa:
function getUserById(id) {
return new Promise((resolve, reject) => {
if (!authorized) {
reject('Unauthorized access to the user data');
}
resolve({
id: id,
username: 'admin'
});
});
}
try {
getUserById(10)
.then(user => console.log(user.username));
// the following code will not execute
console.log('next');
} catch (error) {
console.log(`Caught by try/catch ${error}`);
}
Linguagem de código: JavaScript ( javascript )
Saída:
Uncaught (in promise) Unauthorized access to the user data
Se a promessa for resolvida, você poderá omitir o catch()
método. No futuro, um possível erro poderá fazer com que o programa pare inesperadamente.
Resumo
- Dentro da promessa, o
catch()
método irá capturar o erro causado pelathrow
instrução ereject()
. - Se ocorrer um erro e você não tiver o
catch()
método, o mecanismo JavaScript emitirá um erro de tempo de execução e interromperá o programa.