Tratamento de erros de promessa

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 argumentLinguagem 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 argumentLinguagem 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 dataLinguagem 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 pela throwinstrução e reject().
  • 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *