Posso definir tipos personalizados para exceções definidas pelo usuário em JavaScript? Se sim, como eu faria isso?
javascript
exception
Manki
fonte
fonte
Respostas:
Do WebReference :
fonte
catch (e) { if (e instanceof TypeError) { … } else { throw e; } }
⦃⦄ oucatch (e) { switch (e.constructor) { case TypeError: …; break; default: throw e; }
⦃⦄.Você deve criar uma exceção personalizada que herda prototipicamente de Error. Por exemplo:
Essa é basicamente uma versão simplificada do que foi desatualizado, postado acima, com o aprimoramento que os rastreamentos de pilha funcionam no Firefox e em outros navegadores. Satisfaz os mesmos testes que ele postou:
Uso:
E se comportará é esperado:
fonte
Você pode implementar suas próprias exceções e seu tratamento, por exemplo, como aqui:
Há outra sintaxe para capturar uma exceção digitada, embora isso não funcione em todos os navegadores (por exemplo, não no IE):
fonte
Sim. Você pode jogar o que quiser: números inteiros, seqüências de caracteres, objetos, o que for. Se você deseja lançar um objeto, simplesmente crie um novo objeto, da mesma forma que criaria um sob outras circunstâncias e, em seguida, jogue-o. A referência Javascript do Mozilla tem vários exemplos.
fonte
Isso permite o uso como ..
fonte
e instanceof Error
seria falso.e instanceof MyError
seria verdade, aelse if(e instanceof Error)
afirmação nunca seria avaliada.else if(e instanceof Error)
seria a última captura. Provavelmente seguido por um simpleselse
(que eu não incluí). Mais ou menos comodefault:
na instrução switch, mas por erros.Em resumo:
Se você estiver usando o ES6 sem transpilers :
Consulte Estendendo o erro em Javascript com sintaxe ES6 para saber qual é a melhor prática atual
Se você estiver usando o transpiler Babel :
Opção 1: use babel-plugin-transform-builtin-extend
Opção 2: faça você mesmo (inspirado nessa mesma biblioteca)
Se você estiver usando o ES5 puro :
Alternativa: use estrutura Classtrophobic
Explicação:
Por que estender a classe Error usando ES6 e Babel é um problema?
Porque uma instância do CustomError não é mais reconhecida como tal.
De fato, a partir da documentação oficial de Babel, você não pode estender qualquer built-in classes JavaScript , como
Date
,Array
,DOM
ouError
.O problema está descrito aqui:
E as outras respostas do SO?
Todas as respostas fornecidas corrigem o
instanceof
problema, mas você perde o erro regularconsole.log
:Considerando que, usando o método mencionado acima, você não apenas corrige o
instanceof
problema, mas também mantém o erro regularconsole.log
:fonte
Aqui está como você pode criar erros personalizados com o mesmo
Error
comportamento do nativo . Essa técnica funciona apenas no Chrome e node.js por enquanto. Eu também não recomendaria usá-lo se você não entender o que ele faz.Como resultado, obtemos
Então você pode usá-lo assim:
E use
NotImplementedError
como fariaError
:E se comportará é esperado:
Observe que isso
error.stack
funciona absolutamente correto e não inclui aNotImplementedError
chamada do construtor (graças às v8Error.captureStackTrace()
).Nota. Há feio
eval()
. A única razão pela qual é usada é a correçãoerr.constructor.name
. Se você não precisar, pode simplificar um pouco tudo.fonte
Error.apply(self, arguments)
está especificado para não funcionar . Sugiro copiar o rastreamento de pilha, que é compatível com vários navegadores.Costumo usar uma abordagem com herança prototípica. A substituição
toString()
oferece a vantagem de que ferramentas como o Firebug registram as informações reais em vez de[object Object]
no console para exceções não capturadas.Use
instanceof
para determinar o tipo de exceção.main.js
Exception.js
DuplicateIdException.js
fonte
ES6
Com a nova classe e estender as palavras-chave, agora é muito mais fácil:
fonte
Use a instrução throw .
JavaScript não se importa com o tipo de exceção (como Java). O JavaScript apenas percebe, há uma exceção e, quando você o captura, pode "olhar" o que a exceção "diz".
Se você tiver diferentes tipos de exceção, sugiro usar variáveis que contenham a string / objeto da exceção, ou seja, a mensagem. Onde você precisar, use "throw myException" e, na captura, compare a exceção capturada com myException.
fonte
Veja este exemplo no MDN.
Se você precisar definir vários erros (teste o código aqui !):
O código é principalmente copiado de: Qual é uma boa maneira de estender o Erro em JavaScript?
fonte
Uma alternativa à resposta do asselin para uso nas classes ES2015
fonte
Agora, definimos adicionar o motivo ou quaisquer propriedades que desejamos ao objeto de erro e recuperá-lo. Tornando o erro mais razoável.
fonte