Pergunta

O que seria uma boa forma de relatório de erros em JavaScript em vez de depender de valores nulos, e undefineds quando erros ocorrem e uma função é incapaz de prosseguir em frente.Eu posso pensar em três abordagens:

  1. não fazer nada
  2. lançar uma exceção
  3. afirmar

Aqui está um exemplo simples cenário - uma função que créditos de uma conta de usuário com a quantidade passado.A função credit é parte de um Account objecto.

Aqui está a solução ingênua.

function credit(amount) {
   this.balance += amount;
}

Um grande problema com essa abordagem é que dados inválidos.Vamos corrigi-lo, e usar um valor de retorno para indicar que a operação falhou.

function credit(amount) {
    if(!isInt(amount)) {
        return false;
    }
    this.balance += amount;
}

Esta é uma melhoria em relação à anterior, mas de código do cliente para verificar o valor de retorno para garantir que a operação foi bem-sucedida.Fazendo isso, basicamente, cada método em que o sistema pode tornar-se complicada.

if(!johnDoe.credit(100)) {
    // do some error handling here
}

Uma terceira abordagem, semelhante ao segundo, está para lançar uma exceção.Uma vez que estamos lançando a exceção de nós mesmos, poderíamos lançar um tipo específico de exceção em vez de uma mais geral.

function credit(amount) {
    if(!isInt(amount)) {
        throw new InvalidAmountError(amount);
    }
    this.balance += amount;
}

Uma quarta abordagem semelhante para gerar exceções é a utilização de declarações no seu código.Uma das deficiências comparado com a abordagem acima é que, desde a declaração é genérico, perdemos a capacidade de lançar exceções personalizadas.É ainda possível que, passando o objeto para jogar em cada afirmar chamada.

function credit(amount) {
    assert(!isInt(amount), "Amount to credit is not an integer");
    this.balance += amount;
}

Global assert a função é fácil de escrever e torna o código um pouco mais curto.

function assert(value, message) {
    if(value !== true) {
        throw new AssertionError(message);
    }
}

function AssertionError(message) {
    this.message = message;
}

AssertionError.prototype.toString = function() {
    return 'AssertionError: ' + this.message;
}

Fora destas abordagens, o que seria uma boa maneira de lidar com o inesperado valores, e infeliz caminhos.Existem outras abordagens não mencionados aqui, que poderia ser útil?

Foi útil?

Solução

Considere um log do lado do cliente-quadro para o relatório de erros, tais como Log4js.Pode-se mensagens de log (por exemplo, informações de depuração, warn, error) no navegador ou persistir mensagens para o servidor via Ajax, dependendo da aplicação.

O Log4js site também fornece uma lista de outros JavaScript frameworks de logging.

Uma boa abordagem, utilizando a sua exceção personalizada de exemplo, seria a exceção e o log do erro como você vê o ajuste.

Outras dicas

Uma das deficiências comparado com o acima abordagem é que, desde a declaração é genérico, perdemos a capacidade de jogar exceções personalizadas

Não necessariamente:

function assert(value,message,Exctype) {
    if(value !== true) throw new Exctype(message);
}

Construtores são funções.Funções são valores de primeira classe.Sinta-se livre para passar em volta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top