在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操作符有什么帮助吗?
您可以使用instanceof操作符(但请参阅下面的警告!)。
var myError = new Error('foo');
myError instanceof Error // true
var myString = "Whatever";
myString instanceof Error // false
如果在不同的窗口/帧/iframe中抛出错误,而不是在检查发生的地方,上述操作将不起作用。在这种情况下,instanceof Error检查将返回false,即使对于Error对象也是如此。在这种情况下,最简单的方法是鸭子类型。
if (myError && myError.stack && myError.message) {
// it's an error, probably
}
但是,如果您拥有包含堆栈和消息属性的非错误对象,那么duck-typing可能会产生误报。
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