JavaScript anti-silencioso técnicas para indicar falha
-
16-09-2020 - |
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:
- não fazer nada
- lançar uma exceção
- 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?
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.