проверка на тип ошибки в JS
в JS не представляется возможным проверить, действительно ли аргумент, переданный функции, имеет тип "ошибка" или экземпляр ошибки.
например, это недопустимо:
typeof err === 'error'
так как есть только 6 возможных видах (в виде строк):
оператор typeof возвращает информацию о типе в виде строки. Существует шесть возможных значений, которые typeof
возвращает:
"number", "string", "boolean", " object", "функция"и " неопределенный".
но что, если у меня есть простой пример такой:
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);
}
}
Итак, каков наилучший способ определить, является ли аргумент экземпляром ошибки?
- это instanceof
оператор любой помощи?
3 ответа:
можно использовать
instanceof
оператора.var myError = new Error('foo'); myError instanceof Error // true var myString = "Whatever"; myString instanceof Error // false
Я задал оригинальный вопрос-ответ @ Trott, безусловно, лучший.
однако, когда JS является динамическим языком и существует так много сред выполнения JS,
instanceof
оператор может потерпеть неудачу, особенно в интерфейсной разработке при пересечении границ, таких как iframes. Видеть: https://github.com/mrdoob/three.js/issues/5886если вы в порядке с уткой набрав, это должно быть хорошо:
let isError = function(e){ return e && e.stack && e.message; }
Я лично предпочитайте статически типизированные языки, но если вы используете динамический язык, лучше использовать динамический язык для того, что он есть, а не заставлять его вести себя как статически типизированный язык.
если бы вы хотели получить немного более точный, вы могли бы сделать это:
let isError = function(e){ return e && e.stack && e.message && typeof e.stack === 'string' && typeof e.message === 'string'; }
var myError = new Error('foo'); myError instanceof Error // true var myString = "Whatever"; myString instanceof Error // false
только проблема с этим
myError instanceof Object // true
альтернативой этому было бы использование свойства конструктора.
myError.constructor === Object // false myError.constructor === String // false myError.constructor === Boolean // false myError.constructor === Symbol // false myError.constructor === Function // false myError.constructor === Error // true
хотя следует отметить, что этот матч очень специфичен, например:
myError.constructor === TypeError // false