Я хочу написать общий обработчик ошибок, который будет отлавливать пользовательские ошибки, специально созданные в любом экземпляре кода.
Когда я сделал, 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"}
в которой я смог получить доступ к свойствам ошибки.
В чем разница?
Разница, как видно в коде? Как строка будет просто передана как строка, а объект как объекты, но синтаксис будет другим?
Я не исследовал объект ошибки бросания ... Я сделал только бросание строк.
Есть ли другой способ, кроме двух упомянутых выше методов?
javascript
object
error-handling
exception-handling
throw
Джаяпал Чандран
источник
источник
Error
сОтветы:
Вот хорошее объяснение об объекте The Error и ваших собственных ошибках
Объект ошибки
Что мы можем извлечь из него в случае ошибки? Объект Error во всех браузерах поддерживает следующие два свойства:
name: имя ошибки или, более конкретно, имя функции-конструктора, к которой относится ошибка.
сообщение: описание ошибки, причем это описание зависит от браузера.
Свойство name может возвращать шесть возможных значений, которые, как уже упоминалось, соответствуют именам конструкторов ошибки. Они есть:
Бросать свои ошибки (исключения)
Вместо того чтобы ждать появления одного из 6 типов ошибок, прежде чем элемент управления будет автоматически перенесен из блока try в блок catch, вы также можете явно генерировать свои собственные исключения, чтобы это происходило по требованию. Это отлично подходит для создания собственных определений того, что является ошибкой, и когда управление должно быть передано в catch.
источник
Error
(и подклассы) используются по соглашению. Они также по умолчанию предоставляют свойство стека, хотя его можно вручную добавить к любому другому. Так что на самом деле это в основном соглашение, на ход программы не влияет то, что вы бросаете, просто то, что выthrow
вообще имеете значение. Вы могли бы,throw "grandmother down the stairs";
и это будет работать так же, за исключением того, что не будет прикрепленных функций трассировки стека и обработки ошибок, как ожидают репортеры, отладчикиError
, или свойств, которые идут вместе, если быть более точным.брось "Я Злой"
throw
буду прекратить дальнейшее выполнение и разоблачить строку сообщения на улове ошибку.Консоль после броска никогда не будет достигнута из-за прекращения.
выкинуть новую ошибку ("я такая милая")
throw new Error
выставляет событие ошибки с двумя параметрами имя и сообщение . Это также прекращает дальнейшее исполнениеисточник
Error
, где связь с комментарием? Половина людей, комментирующих и отвечающих на вопросы ОП, должны были просто молчать.Used as a function
по этой ссылке ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Следующая статья, возможно, более подробно описывает, какой вариант лучше выбрать;
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 (неуверенные в версиях), неправильно сообщают сообщение при использовании первого.источник
Вы сначала упоминаете этот код:
а затем в первом примере вы пишете:
Первый объект Error действительно будет работать, потому что он ожидает строковое значение, в данном случае «sample». Второе - не потому, что вы пытаетесь передать объект, а оно ожидает строку.
Объект ошибки будет иметь свойство «message», которое будет «sample».
источник
toString()
метод для переданного объекта, что приводит[object Object]
к ошибке (как написано в Op).TLDR: они эквивалентны.
источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
источник
вы можете
throw
как объекттогда, например, в вашем
try/catch
или просто выбросить строковую ошибку
источник
Error
Конструктор используется для создания объекта ошибки. Объекты ошибок выбрасываются при возникновении ошибок во время выполнения. Объект Error также может использоваться как базовый объект для определенных пользователем исключений.Определяемые пользователем ошибки генерируются через
throw
оператор. управление программой будет передано первомуcatch
блоку в стеке вызовов.Разница между выдачей ошибки с и без объекта Error:
В chrome devtools выглядит так:
Chrome говорит нам, что у нас есть неперехваченная ошибка, которая просто является объектом JS. Сам объект может иметь информацию об ошибке, но мы до сих пор не знаем, откуда она появилась. Не очень полезно, когда мы работаем над нашим кодом и отлаживаем его.
В chrome devtools выглядит так:
Ошибка, выдаваемая объектом Error, дает нам трассировку стека при его расширении. Это дает нам ценную информацию, откуда именно произошла ошибка, которая часто является ценной информацией при отладке вашего кода. Также обратите внимание, что в сообщении об ошибке указывается
[object Object]
, чтоError
конструктор ожидает строку сообщения в качестве первого аргумента. Когда он получает объект, он приводит его в строку.источник
Реагировать поведение
Помимо остальных ответов, я хотел бы показать одно отличие в React.
Если я брошу a
new Error()
и я нахожусь в режиме разработки, я получу экран ошибки и журнал консоли. Если я брошу строковый литерал, я увижу его только в консоли и, возможно, пропущу его, если не смотрю журнал консоли.пример
Выдача сообщения об ошибке в консоль и отображение экрана ошибки в режиме разработки (экран не будет виден в рабочей среде ).
Принимая во внимание, что следующий код только входит в консоль:
источник