Qual é a diferença entre `lançar novo erro` e `lançar algum objeto`?

quero escrever um manipulador de erros comum que irá apanhar erros personalizados lançados de propósito em qualquer instância do Código.

quando o fiz throw new Error('sample') como no seguinte código

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}

o registo mostra no Firefox como {[[3]} e não consegui analisar o objecto.

Para o segundo throw o registo mostra como: Error: hehe

Considerando que quando o fiz

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}

o console mostrou como: Object { hehe="haha"} no qual eu era capaz de acessar as propriedades do erro.

o que é o diferença?

a diferença está no código? Como string será apenas passado como string e objeto como objetos, mas a sintaxe será diferente?

Ainda não explorei o lançamento de um objecto de erro.

Há outra maneira além dos dois métodos acima mencionados?

Author: Xufox, 2012-02-06

4 answers

Aqui está uma boa explicação sobre o objecto de erro e lançar os seus próprios erros

O Objecto De Erro

O que podemos extrair dela em caso de erro. O objecto de erro em todos os navegadores suporta as duas propriedades seguintes:
  • Nome: o nome do erro, ou mais especificamente, o nome da função construtor a que o erro pertence.

  • Mensagem: uma descrição do erro, com esta descrição variando dependendo do navegador.

Seis valores possíveis podem ser devolvidos pela propriedade nome, que como mencionado correspondem aos nomes dos construtores do erro. Eles são:

Error Name          Description

EvalError           An error in the eval() function has occurred.

RangeError          Out of range number value has occurred.

ReferenceError      An illegal reference has occurred.

SyntaxError         A syntax error within code inside the eval() function has occurred.
                    All other syntax errors are not caught by try/catch/finally, and will
                    trigger the default browser error message associated with the error. 
                    To catch actual syntax errors, you may use the onerror event.

TypeError           An error in the expected variable type has occurred.

URIError            An error when encoding or decoding the URI has occurred 
                   (ie: when calling encodeURI()).

Lançar os seus próprios erros (excepções)

Em vez de esperar que um dos 6 tipos de erros ocorra antes que o controlo seja automaticamente transferido do bloco de tentativa para o bloco de captura, você também pode explicitamente lançar as suas próprias excepções para forçar que isso aconteça em demanda. Isso é ótimo para criar suas próprias definições do que é um erro e quando o controle deve ser transferido para a captura.

 171
Author: Hemant Metalia, 2015-02-11 16:53:20

O seguinte artigo, talvez, entra em mais detalhes sobre qual é a melhor escolha; throw 'An error' ou throw 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, uma vez que navegadores como o Internet Explorer e Safari (inseguro das versões) não relatam corretamente a mensagem ao usar o primeiro.

Fazê-lo causará um erro, mas não todos. os navegadores respondem como se esperava. Firefox, Opera e Chrome exibem cada uma uma mensagem "uncaught exception" e, em seguida, incluem a cadeia de mensagens. Safari e Internet Explorer simplesmente lançam um erro de "uncaught exception" e não fornecem a cadeia de mensagens de todo. Claramente, isto é subóptimo do ponto de vista de depuração.
 55
Author: Ed ., 2012-10-22 17:28:43
Atira "eu sou o mal"

Atirar irá terminar {[7] } a execução seguinte e expor o texto da mensagem em apanhar o erro.

try{
    throw 'I\'m Evil'
    console.log('You\'ll never reach to me', 123465)
}
catch(e){
    console.log(e); //I\'m Evil
}

A consola depois deatirar nunca será alcançada a causa da terminação.

Lança um novo erro ("sou tão doce")

lançar um novo erro expõe um evento de erro com dois parâmetros name & mensagem Também termina a execução posterior

try{
     throw new Error('I\'m Evil')
     console.log('You\'ll never reach to me', 123465)
}
catch(e){
        console.log(e.name, e.message); //Error, I\'m Evil
}
 39
Author: Nishchit Dhanani, 2017-06-08 03:01:44

Mencione primeiro este código:

throw new Error('sample')

E então no seu primeiro exemplo você escreve:

throw new Error({'hehe':'haha'}) 

O primeiro objecto de erro realmente funcionaria, porque está à espera de um valor de cadeia de caracteres, neste caso 'amostra'. O segundo não seria porque você está tentando passar um objeto para dentro, e ele está esperando uma corda.

O objecto de erro teria a propriedade "mensagem", que seria 'amostra'.

 22
Author: IonicBurger, 2014-08-08 14:56:11