В чем разница между "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);
}

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

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

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

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

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

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

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

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

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

4 ответов


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

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

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

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

  • сообщение: 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, вы также можете явно бросить свои собственные исключения, чтобы заставить это произойти по требованию. Это отлично подходит для создания ваших собственных определений, что такое ошибка и, когда контроль должен быть передан поймать.


в следующей статье, возможно, более подробно говорится о том, какой из них является лучшим выбором;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".