ale*_*tes 47 javascript error-handling ecmascript-6
我使用自定义错误(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);
};
}
Run Code Online (Sandbox Code Playgroud)
现在我宁愿为这种类型的流使用开关,导致类似于:
import { DatabaseEntryNotFoundError, NotAllowedError } from 'customError';
function fooRoute(req, 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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
然而,instanceof并不像那样工作.所以后者失败了.
有没有办法在switch语句中检查其类的实例?
Dmi*_*tin 84
一个好的选择是使用对象的constructor
属性:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,constructor
必须与创建对象的内容完全匹配(假设error
是实例,NotAllowedError
并且NotAllowedError
是其子类Error
):
error.constructor === NotAllowedError
是 true
error.constructor === Error
是 false
这有所不同instanceof
,它也可以匹配超类:
error instanceof NotAllowedError
是 true
error instanceof Error
是 true
ya_*_*mon 14
解决方法,以避免if-else。在这里找到
switch (true) {
case error instanceof NotAllowedError:
return res.send(400);
case error instanceof DatabaseEntryNotFoundError:
return res.send(404);
default:
log('Failed to do something async with an unspecified error: ', error);
return res.send(500);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19905 次 |
最近记录: |