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

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

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

У меня не было обнаруженного объекта ошибки бросания... Я сделал только бросание строк.

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

+305
источник поделиться
7 ответов

Вот хорошее объяснение об объекте The 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.

+191
источник

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

+69
источник
другие ответы

Связанные вопросы


Похожие вопросы

бросить "Я злая"

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

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

Консоль после броска никогда не будет достигнута по причине завершения.

throw new Error ( "Я так сладок" )

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

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
}
+64
источник

Вы впервые упомянули этот код:

throw new Error('sample')

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

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

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

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

+30
источник

вы можете 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
+5
источник

TL;DR: они эквивалентны.

// 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

+3
источник

Конструктор 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 ожидает строку сообщения в качестве первого аргумента. Когда он получает объект, он приводит его в строку.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос