Quero escrever um manipulador de erro comum que capture erros personalizados lançados de propósito em qualquer instância do código.
Quando eu throw new Error('sample')
gostei no código a seguir
try {
throw new Error({'hehe':'haha'});
// throw new Error('hehe');
} catch(e) {
alert(e);
console.log(e);
}
O log é exibido no Firefox Error: [object Object]
e eu não consegui analisar o objeto.
Por um segundo, throw
o log mostra como:Error: hehe
Considerando que quando eu fiz
try {
throw ({'hehe':'haha'});
} catch(e) {
alert(e);
console.log(e);
}
o console mostrou como: Object { hehe="haha"}
no qual eu consegui acessar as propriedades do erro.
Qual é a diferença?
A diferença é vista no código? Como string será apenas passada como string e objeto como objetos, mas a sintaxe será diferente?
Eu não explorei o lançamento do objeto de erro ... eu havia feito apenas o lançamento de strings.
Existe outra maneira além dos dois métodos mencionados acima?
fonte
Error
sRespostas:
Aqui está uma boa explicação sobre o objeto The Error e lançando seus próprios erros
O objeto de erro
Apenas o que podemos extrair dele em um evento de erro? O objeto Erro em todos os navegadores oferece suporte às duas propriedades a seguir:
nome: o nome do erro, ou mais especificamente, o nome da função de construtor à qual o erro pertence.
mensagem: Uma descrição do erro, com essa descrição variando, dependendo do navegador.
Seis valores possíveis podem ser retornados pela propriedade name, que conforme mencionado corresponde aos nomes dos construtores do erro. Eles são:
Lançando seus próprios erros (exceções)
Em vez de esperar que um dos 6 tipos de erros ocorra antes que o controle seja transferido automaticamente do bloco try para o bloco catch, você também pode lançar explicitamente suas próprias exceções para forçar isso a ocorrer sob demanda. Isso é ótimo para criar suas próprias definições sobre o que é um erro e quando o controle deve ser transferido para captura.
fonte
Error
(e subclasses) são usados por convenção. Por padrão, eles também fornecem uma propriedade de pilha, embora isso possa ser adicionado manualmente a qualquer outra. Então, na verdade, é na maioria das vezes convencional, o fluxo do programa não é afetado pelo que você joga, apenas por vocêthrow
. Você poderiathrow "grandmother down the stairs";
e funcionaria da mesma maneira, exceto que não haverá um rastreamento de pilha anexado e funções de tratamento de erros, repórteres, depuradores esperamError
ou as propriedades que o acompanham, para ser mais preciso.jogue "eu sou mau"
throw
irá terminar a posterior execução e expor cadeia de mensagem em captura o erro.O console após o lançamento nunca será alcançado como causa de rescisão.
lançar novo erro ("eu sou tão doce")
throw new Error
expõe um evento de erro com dois nomes e mensagem de parâmetro . Também encerra a execução adicionalfonte
Error
, ok, onde está a conexão com o comentário? Metade das pessoas que comentam e respondem à pergunta dos OPs deveria ter permanecido em silêncio.Used as a function
partir deste link ... developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…O artigo a seguir talvez entre em mais detalhes sobre qual é a melhor escolha;
throw 'An error'
outhrow new Error('An error')
:http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/
Ele sugere que o último (
new Error()
) é mais confiável, pois navegadores como o Internet Explorer e o Safari (sem certeza de versões) não relatam corretamente a mensagem ao usá-lo.fonte
Você primeiro mencionou este código:
e então no seu primeiro exemplo você escreve:
O primeiro objeto Error realmente funcionaria, porque está esperando um valor de string, neste caso 'sample'. O segundo não seria porque você está tentando passar um objeto e espera uma string.
O objeto de erro teria a propriedade "message", que seria 'sample'.
fonte
toString()
método no objeto transmitido, resultando no[object Object]
erro (como o Op escreveu).TLDR: eles são equivalentes.
source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
fonte
você pode
throw
como objetoentão, por exemplo, no seu
try/catch
ou apenas lançar um erro de string
fonte
O
Error
construtor é usado para criar um objeto de erro. Os objetos de erro são lançados quando ocorrem erros de tempo de execução. O objeto Erro também pode ser usado como objeto básico para exceções definidas pelo usuário.Os erros definidos pelo usuário são gerados por meio da
throw
instrução o controle do programa será passado para o primeirocatch
bloco na pilha de chamadas.A diferença entre lançar um erro com e sem o objeto Error:
No chrome, as devtools são assim:
O Chrome nos diz que temos um erro não detectado, que é apenas um objeto JS. O objeto em si pode ter informações sobre o erro, mas ainda não sabemos imediatamente de onde ele veio. Não é muito útil quando estamos trabalhando em nosso código e depurando-o.
No chrome, as devtools são assim:
Um erro lançado com o objeto Error nos fornece um rastreamento de pilha quando o expandimos. Isso nos fornece informações valiosas, de onde veio o erro, que geralmente é informações valiosas ao depurar seu código. Observe também que o erro diz que
[object Object]
isso ocorre porque oError
construtor espera uma sequência de mensagens como primeiro argumento. Quando recebe um objeto, ele o coage em uma string.fonte
Comportamento de reação
Além do restante das respostas, gostaria de mostrar uma diferença no React.
Se eu jogar ae
new Error()
estiver no modo de desenvolvimento, receberei uma tela de erro e um log do console. Se eu lançar uma string literal, eu a verei apenas no console e possivelmente a perderá, se não estiver assistindo o log do console.Exemplo
Lançar um log de erros no console e mostra uma tela de erro enquanto estiver no modo de desenvolvimento (a tela não estará visível na produção).
Enquanto o código a seguir apenas efetua login no console:
fonte