2
respostas

Tratamento de erro não está agindo como esperado.

Implementei o código como o do exercício, contudo modifiquei erroneamente uma instrução no método adiciona da classe NegociacaoDao. Sem querer eu deletei um caractere do método .transaction tornando-o .transation. O esperado é que com isso, minha request desse falha, imprimisse no console o e.target.error, enviasse para o Controller a mensagem: "Não foi possível adicionar a negociação" e este a exibisse para o usuário. O problema é que está sendo exibido para o usuário a seguinte mensagem: "TypeError: this._connection.transation is not a function" (erro que devia estar sendo exibido no console) e no console nenhum erro é exibido. Qual o motivo disso?

Código de NegociaçãoDao:

class NegociacaoDao {

    constructor(connection){

      this._connection = connection;

      this._store = 'negociacoes';

    }

    adiciona(negociacao) {

      return new Promise((resolve, reject) => {

        let request = this._connection
          .transation([this._store], 'readwrite')
          .objectStore(this._store)
          .add(negociacao);

        request.onsuccess = e => {

            resolve();

        };

        request.onerror = e => {

            console.log(e.target.error);

            reject('Não foi possível adicionar a negociação');

        };

      });

    }

}

Código pertinente do Controller:

adiciona(event) {

        event.preventDefault();

        ConnectionFactory
          .getConnection()
          .then(connection => {

              let negociacao = this._criaNegociacao();

              new NegociacaoDao(connection)
                .adiciona(negociacao)
                .then(() => {

                  this._listaNegociacoes.adiciona(negociacao);
                  this._mensagem.texto = 'Negociação adicionada com sucesso';
                  this._limpaFormulario();

                })
                .catch(erro => this._mensagem.texto = erro);
          });
    }
2 respostas

Só para elaborar a questão: só consegui fazer funcionar corretamente colocando o tratamento de erro de alto nível no catch do controller, onde a chamada à Promise é feita. Aparentemente, não importa o que eu mando no reject dos métodos da NegociacaoDao, ele sobe o erro no lugar do que eu defini. Só pra constar, esse comportamente aconteceu para todos os métodos da classe NegociacaoDao: adiciona, listaTodos e apagaTodos (esses dois últimos implementados em lições posteriores).

Fala ai Eric, tudo bem? Nesses casos, quando métodos de baixo nivel podem dar erros e tu quer fazer o tratamento, você poderia fazer um throw new Error para subir o erro para as classes pais.

Exemplo:

.catch(erro => {
    this._mensagem.texto = erro
    throw new Error(error)
});

Espero ter ajudado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software