В чем разница между `throw new Error` и` throw someObject`? - PullRequest
305 голосов
/ 06 февраля 2012

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

Когда я сделал 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"}, в которой я смог получить доступ к свойствам ошибки.

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

Разница в коде видна? Как строка будет просто передана как строка, а объект как объекты, но синтаксис будет другим?

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

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

Ответы [ 7 ]

191 голосов
/ 06 февраля 2012

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

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

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

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

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

Шесть возможных значений могут быть возвращены свойством 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.

69 голосов
/ 22 октября 2012

В следующей статье, возможно, более подробно рассказывается о том, какой из них лучше; 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 отображают сообщение «uncaught исключения», а затем включают строку сообщения. Safari и Internet Explorer просто выдают ошибку «необнаруженное исключение» и вообще не предоставляют строку сообщения. Ясно, что это неоптимально с точки зрения отладки.

64 голосов
/ 20 декабря 2016

бросок "Я Злой"

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

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

Консоль после throw никогда не будет достигнута из-за прекращения.

выбросить новую ошибку («Я такой милый»)

throw new Error предоставляет событие ошибки с двумя параметрами name & message . Также прекращается дальнейшее исполнение

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
}
30 голосов
/ 08 августа 2014

Сначала вы упоминаете этот код:

throw new Error('sample')

, а затем в своем первом примере пишете:

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

Первый объект Error действительно будет работать, потому что он ожидает строкузначение, в данном случае «образец».Второе - не потому, что вы пытаетесь передать объект, и он ожидает строку.

У объекта ошибки будет свойство «message», которое будет «sample».

5 голосов
/ 01 февраля 2019

вы можете throw как объект

throw ({message: 'This Failed'})

тогда например в вашем try/catch

try {
//
} catch(e) {
    console.log(e); //{message: 'This Failed'}
    console.log(e.message); //This Failed
}

или просто выбросить ошибку строки

throw ('Your error')

try {
//
} catch(e) {
    console.log(e); //Your error
}

throw new Error //only accept a string
3 голосов
/ 24 мая 2019

TLDR: они эквивалентны.

// this:
const x = Error('I was created using a function call!');
​​​​// has the same functionality as this:
const y = new Error('I was constructed via the "new" keyword!');

источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error

0 голосов
/ 16 июля 2019

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

Определяемые пользователем ошибки генерируются с помощью оператора throw. управление программой будет передано в первый блок catch в стеке вызовов.

Разница между выдачей ошибки с и без объекта Error:


throw {'hehe':'haha'};

В chrome devtools выглядит так:

enter image description here

Chrome сообщает нам, что у нас есть необработанная ошибка, которая является просто объектом JS. Сам объект может иметь информацию об ошибке, но мы до сих пор не знаем, откуда она появилась. Не очень полезно, когда мы работаем над нашим кодом и отлаживаем его.


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

В chrome devtools выглядит так:

enter image description here

Ошибка, выдаваемая объектом Error, дает нам трассировку стека при ее расширении. Это дает нам ценную информацию, откуда именно произошла ошибка, которая часто является ценной информацией при отладке вашего кода. Также обратите внимание, что в сообщении об ошибке указано [object Object], это связано с тем, что конструктор Error ожидает строку сообщения в качестве первого аргумента. Когда он получает объект, он приводит его в строку.

...