我使用自定义错误(
es6-error),允许我根据他们的类处理错误:
import { DatabaseEntryNotFoundError,NotAllowedError } from 'customError';
function fooRoute(req,res) {
doSomethingAsync()
.then(() => {
// on resolve / success
return res.send(200);
})
.catch((error) => {
// on reject / failure
if (error instanceof DatabaseEntryNotFoundError) {
return res.send(404);
} else if (error instanceof NotAllowedError) {
return res.send(400);
}
log('Failed to do something async with an unspecified error: ',error);
return res.send(500);
};
}
现在我宁愿为这种类型的流程使用一个开关,导致如下:
import { DatabaseEntryNotFoundError,res) {
doSomethingAsync()
.then(() => {
// on resolve / success
return res.send(200);
})
.catch((error) => {
// on reject / failure
switch (error instanceof) {
case NotAllowedError:
return res.send(400);
case DatabaseEntryNotFoundError:
return res.send(404);
default:
log('Failed to do something async with an unspecified error: ',error);
return res.send(500);
}
});
}
instanceof不行.所以后者失败了.
有没有办法在switch语句中检查其类的实例?
解决方法
一个很好的选择是使用对象的构造函数
property:
// on reject / failure
switch (error.constructor) {
case NotAllowedError:
return res.send(400);
case DatabaseEntryNotFoundError:
return res.send(404);
default:
log('Failed to do something async with an unspecified error: ',error);
return res.send(500);
}
请注意,构造函数必须与创建对象的构造函数完全匹配(假设错误是NotAllowedError的实例,NotAllowedError是Error的子类):
> error.constructor === NotAllowedError为true
> error.constructor ===错误是false
这与instanceof有所不同,它也可以匹配超级类:
> NotAllowedError的error instanceof为true
> error instanceof Error是true
检查this interesting post关于构造函数属性.