В чем разница между `throw new Error` и `throw someObject`?


Я хочу написать общий обработчик ошибок, который будет ловить пользовательские ошибки, брошенные специально в любом экземпляре кода.

когда я throw new Error('sample') как в следующем коде

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

журнал показывает в Firefox как Error: [object Object] и я не мог разобрать объект.

второй throw журнал показывает, как: Error: hehe

тогда как когда я сделал

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

консоль показала как: Object { hehe="haha"} в котором я смог получить доступ к ошибке свойства.

в чем разница?

разница, как видно из кода? Как строка будет просто передаваться как строка и объект как объекты, но синтаксис будет отличаться?

Я не исследовал объект ошибки метания... я сделал только метание строк.

есть ли другой способ, кроме двух вышеупомянутых методов?

4 234

4 ответа:

вот хорошее объяснение о объект ошибки и бросая свои собственные ошибки

Объект Ошибки

только то, что мы можем извлечь из него в случае ошибки. Объект Error во всех браузерах поддерживает следующие два свойства:

  • имя: имя ошибки или, более конкретно, имя функции конструктора, к которой принадлежит ошибка.

  • сообщение: A описание ошибки, причем это описание варьируется в зависимости от браузера.

шесть возможных значений могут быть возвращены свойством name, которое, как уже упоминалось, соответствует именам конструкторов ошибки. Они таковы:

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()).

бросая свои собственные ошибки (исключения)

вместо ожидания возникновения одного из 6 типов ошибок перед автоматической передачей управления из блока try в блок catch, вы также можете явно бросить свои собственные исключения, чтобы заставить это произойти по требованию. Это отлично подходит для создания собственных определений того, что такое ошибка и когда контроль должен быть передан в catch.

в следующей статье, возможно, более подробно говорится о том, какой из них является лучшим выбором;throw 'An error' или throw new Error('An error'):

http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

это говорит о том, что последний (new Error()) является более надежным, так как браузеры, такие как Internet Explorer и Safari (не уверены в версиях) не правильно сообщают сообщение при использовании первого.

это вызовет ошибка будет выброшена, но не все браузеры отвечают так, как вы ожидаете. Firefox, Opera и Chrome отображают сообщение "неперехваченное исключение", а затем включают строку сообщения. Safari и Internet Explorer просто выдают ошибку "неперехваченное исключение" и вообще не предоставляют строку сообщения. Очевидно, что это неоптимально с точки зрения отладки.

бросьте "я злой"

бросок завершить дальнейшее выполнение и выставить строку сообщения на лови ошибка.

try{
    throw 'I\'m Evil'
    console.log('You\'ll never reach to me', 123465)
}
catch(e){
    console.log(e); //I\'m Evil
}
. Он также прекращается далее исполнение
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
}

вы впервые упоминаете этот код:

throw new Error('sample')

и тогда в вашем первом примере вы пишете:

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

первый объект ошибки будет фактически работать, потому что он ожидает строковое значение, в данном случае "образец". Второй не будет, потому что вы пытаетесь передать объект, и он ожидает строку.

объект ошибки будет иметь свойство "message", которое будет "sample".