В JS не представляется возможным проверить, действительно ли аргумент, переданный функции, имеет тип 'error' или экземпляр Error.
Например, это недопустимо:
typeof err === 'error'
поскольку существует только 6 возможных типов (в виде строк):
Оператор typeof возвращает информацию о типе в виде строки. Есть шесть возможных значений, которые typeof
возвращаются:
"число", "строка", "логическое значение", "объект", "функция" и "неопределенное".
Но что, если у меня есть простой пример использования, подобный этому:
function errorHandler(err) {
if (typeof err === 'error') {
throw err;
}
else {
console.error('Unexpectedly, no error was passed to error handler. But here is the message:',err);
}
}
так каков наилучший способ определить, является ли аргумент экземпляром Error?
является instanceof
оператором какой - либо помощи?
javascript
node.js
Александр Миллс
источник
источник
err instanceof Error
err
(скажем) iframe, но затем передаете его родительскому окну для передачи, вы получите(err instanceof Error) === false
. Это связано с тем, что у iframe и его родительского окна разныеError
прототипы объектов. Точно так же объект, какobj = {};
will, при передаче функции, выполняющейся в другом окне, yeild(obj instanceof Object)===false
. (Что еще хуже, в IE, если вы сохраните ссылку на obj после того, как окно будет разрушено или перемещено, попытка вызвать прототип объекта fns likeobj.hasOwnProperty()
вызовет ошибки!)catch((err)=>{if (err === ENOENT)
возвращаетENOENT is not defined
ошибку?Ответы:
Вы можете использовать
instanceof
оператор (но см. Предостережение ниже!).Вышеуказанное не сработает, если ошибка была выдана в другом окне / фрейме / фрейме, отличном от того, где происходит проверка. В этом случае
instanceof Error
проверка вернет false, даже дляError
объекта. В таком случае, самый простой подход - это печатание на клавиатуре.Тем не менее, типизация утки может привести к ложным срабатываниям, если у вас есть объекты без ошибок, которые содержат
stack
иmessage
свойства.источник
ReferenceError
экземпляром. Вы проверяете глобальныйReferenceError
объект. Попробуйте это:try { foo } catch (e) { console.log(e instanceof Error) }
это логиtrue
. ЕслиReferenceError
по какой-то причине вы пытаетесь проверить глобальный объект, вы можете использоватьError.isPrototypeOf(ReferenceError)
ReferenceError
экземпляры не были экземплярамиError
. Это произошло из-за вызоваvm.runInNewContext()
в узле, где все стандартные прототипы переопределяются. Все мои результаты не были экземплярами стандартных объектов. Я искал в SO об этом и попал в эту ветку :)const error = (err instanceof Error || err instanceof TypeError) ? err : new Error(err.message ? err.message : err);
instanceof
это определенный тип ошибки, хотя?Я задал оригинальный вопрос - ответ @ Тротта, безусловно, лучший.
Однако, поскольку JS является динамическим языком, а среда выполнения JS так много,
instanceof
оператор может потерпеть неудачу, особенно при разработке интерфейса, при пересечении границ, таких как iframes. Смотрите: https://github.com/mrdoob/three.js/issues/5886Если вы в порядке с печатанием утки, это должно быть хорошо:
Я лично предпочитаю статически типизированные языки, но если вы используете динамический язык, лучше использовать динамический язык таким, какой он есть, а не заставлять его вести себя как статически типизированный язык.
если вы хотите получить более точную информацию, вы можете сделать это:
источник
instanceof
оператора в некоторых случаях, см. Статью по ссылке .Error
,ReferenceError
...). И в моем окруженииinstanceof
неудачи с треском проваливаются при многих обстоятельствах.Единственная проблема с этим
Альтернативой этому было бы использование свойства конструктора.
Хотя следует отметить, что это совпадение очень специфично, например:
источник
Вы можете
Object.prototype.toString
легко проверить, является ли объект объектомError
, который также будет работать для разных кадров.источник
Вы можете использовать obj.constructor.name для проверки «класса» объекта https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Function_names_in_classes
Например
В приведенной выше строке будет записано «Ошибка», которая является именем класса объекта. Это может быть использовано с любыми классами в javascript, если класс не использует свойство, которое называется «имя»
источник
Спасибо @Trott за ваш код, я просто использовал тот же код и добавил рабочий пример в реальном времени для пользы других.
источник
Или используйте это для различных типов ошибок
источник