【发布时间】:2015-08-08 18:13:59
【问题描述】:
在 JS 中,似乎无法检查传递给函数的参数实际上是“错误”类型还是错误实例。
例如,这是无效的:
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 运算符有什么帮助吗?
【问题讨论】:
-
是的,使用
err instanceof Error -
@colecmc 如果错误可能来自框架或另一个窗口中的代码,那不会有问题吗?在这种情况下,会有不同的原型 Error 对象,并且 instanceof 不会按预期工作。 (见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)
-
@Doin,我不这么认为。它只会验证实际的错误对象。
-
@colecmc,我想你会发现如果你在(比如说)一个 iframe 中抛出了
err,然后将它传递给父窗口进行处理,你会得到@987654329 @。这是因为 iframe 及其父窗口具有不同的Error对象原型。类似地,像obj = {};这样的对象,当传递给在不同窗口中运行的函数时,会产生(obj instanceof Object)===false。 (更糟糕的是,在 IE 中,如果您在 obj 的窗口被销毁或导航后保留对 obj 的引用,则尝试像obj.hasOwnProperty()这样调用对象原型 fns 会引发错误!) -
如何检查错误类型?即
catch((err)=>{if (err === ENOENT)返回ENOENT is not defined错误?
标签: javascript node.js