检查 JS 中的错误类型

2022-08-30 00:29:06

在JS中,似乎无法检查传递给函数的参数实际上是否为“error”类型或Error的实例。

例如,这是无效的:

typeof err === 'error'

因为只有6种可能的类型(以字符串的形式):

typeof 运算符以字符串形式返回类型信息。返回六个可能的值:typeof

“数字”,“字符串”,“布尔值”,“对象”,“函数”和“未定义”。

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);
    }
}

那么确定参数是否是Error实例的最佳方法是什么?

运营商有什么帮助吗?instanceof


答案 1

您可以使用 instanceof 运算符(但请参阅下面的注意事项!

var myError = new Error('foo');
myError instanceof Error // true
var myString = "Whatever";
myString instanceof Error // false

如果错误是在与检查发生位置不同的窗口/帧/iframe中引发的,则上述操作将不起作用。在这种情况下,检查将返回 false,即使对于对象也是如此。在这种情况下,最简单的方法是鸭子打字。instanceof ErrorError

if (myError && myError.stack && myError.message) {
  // it's an error, probably
}

但是,如果具有包含 和 属性的非错误对象,则鸭子类型可能会产生误报。stackmessage


答案 2

我问了最初的问题 - @Trott的答案肯定是最好的。

然而,由于JS是一种动态语言,并且有如此多的JS运行时环境,操作员可能会失败,特别是在跨越边界(如iframes)的前端开发中。请参见: https://github.com/mrdoob/three.js/issues/5886instanceof

如果你对鸭子打字没问题,这应该很好:

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';
    }