проверка на тип ошибки в JS


в JS не представляется возможным проверить, действительно ли аргумент, переданный функции, имеет тип "ошибка" или экземпляр ошибки.

например, это недопустимо:

typeof err === 'error'

так как есть только 6 возможных видах (в виде строк):

оператор typeof возвращает информацию о типе в виде строки. Существует шесть возможных значений, которые typeof возвращает:

"number", "string", "boolean", " object", "функция"и " неопределенный".

MSDN

но что, если у меня есть простой пример такой:

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 68

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