Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Customizar Exceptions

Boa noite pessoal,

Seguinte, na minha API, sempre que der um erro, eu vou retornar um objeto no body com algumas infos a mais, por exemplo:

private String titulo;
private String mensagem;
private Long status;
private Long timestamp;
private String mensagemDesenvolvedor;

Quando ocorrer, preciso passar esse objeto para meu componente, porém só estou conseguindo passar um texto.

Minha camada service:

// domain/xpto/MeuService.js
export default class MeuService {
    delete(id) {
        return this._resource.delete({ id })
            .then(null, err => {
                // o err.body vem meu objeto detalhado
                // quero passar ele na minha chamada
                // Ex: throw new Error(err.body);
                throw new Error(err.body.mensagem);
            })
    }
}

Meu componente:

// components/xpto/MeuComponente.vue
delete(objeto) {            
    this.service.delete(objeto.id)
            .then(()=> {
                // Código omitido
            }, err => {
                // Dessa forma só pego a mensagem
                // Queria por exemplo: 
                //        err.mensagem, 
                //        err.titulo
                this.message = err.message;
            });
}

Tem como fazer isso? A solução seria criar uma exception customizada? Como ficaria a organizacao dos fontes nesse caso?

Obrigado pela atenção.

3 respostas
solução!

Se você passar um objeto para new Error(), o objeto será serializado e convertido para uma string, é padrão de Error, por isso você não conseguirá acessar as propriedades do objeto.

Se você quiser manter essa decisão de design, deve serializar seu erro e depois deserializá-lo.

Um exemplo stand alone:

try {

  throw new Error(JSON.stringify({ nome: 'xuxa' }))
} catch(err) {

  let object = JSON.parse(err.message);
  console.log(object.nome);
}

Sucesso e bom estudo meu aluno.

Pode criar uma custom exception também. Por exemplo:

class MinhaException extends Error {

    constructor(msg = '', dadosExtras) {

        super(msg);
        this.name = this.constructor.name;
        this.dadosExtras = dadosExtras;
    }
}

try {

  throw new MinhaException('mensagem aqui', { nome: 'xuxa'});
} catch(err) {

  console.log(err.dadosExtras);
}

Obrigado mestre.