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

那么,确定参数是否为错误实例的最佳方式是什么呢?

instanceof号接线员有什么帮助吗?

推荐答案

您可以使用instanceof运算符(但请参见下面的警告!).

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

如果错误被抛出的窗口/帧/iframe与判断发生的窗口/帧/iframe不同,上述操作将不起作用.在这种情况下,即使对于Error对象,instanceof Error判断也将返回false.在这种情况下,最简单的方法是duck类型.

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

但是,如果有包含stackmessage个属性的非错误对象,duck类型可能会产生误报.

Javascript相关问答推荐

Regex可以 Select 以任何顺序匹配组

TestCafe预计文本等于以下内容之一

如何从JavaScript中的公共方法调用私有方法?

想要检测字符串中的所有单词

无法将nPM simplex-noise包导入在JS项目中工作

RxJS setTimeout操作符等效

自定义高图中的x轴标签序列

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

为什么按钮会随浮动属性一起移动?

实现JS代码更改CSS元素

在使用HighChats时如何避免Datatables重新初始化错误?

400 bad request error posting through node-fetch

使用Nuxt Apollo在Piniastore 中获取产品细节

DOM不自动更新,尽管运行倒计时TS,JS

在画布中调整边上反弹框的大小失败

<;img>;标记无法呈现图像

如何使用基于promise (非事件emits 器)的方法来传输数据?

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

如何找到带有特定文本和测试ID的div?

如何在Jest中模拟函数