[英]Flow control with async without throwing Errors
我遇到一个问题,其中Intellij向我警告本地抛出的异常“抛出” 。 在仔细研究为什么不行之后,这是有道理的,不应将错误用于流量控制。 我面临的问题虽然是异步的,但我不能不在本地扔东西而拒绝诺言,我会得到警告。
我的一些示例代码。
顶层接受请求并等待控制器的响应:
Router.post("/", async (req, res) => {
try {
let itemController = new ItemController(req.body);
let response = await itemController.request();
res.send(response);
} catch (error) {
res.status(500).send({ error: error});
}
});
控制器接受请求并等待其他功能以获取一些数据。
async request() {
try {
await isValidItem();
return await this.initialize();
} catch(error) {
throw error;
}
}
然后我有一个获取该物品制造商ID的函数,我遇到了问题。 如果SQL查询没有失败并且响应中没有任何内容,则需要抛出本地错误,以便请求可以正常失败。 并向客户端发送适当的500错误。
async queryManufacturerID() {
try {
let result = await this.queryManufacturerID(this.itemID, this.brand);
if (result === false) {
throw new Error("this item has no manufacturer ID");
} else {
this.manufacturerID = result["manufacturerItemID"];
}
} catch (error) {
throw error;
}
}
我的问题是我知道我可以调整它,以便其他得到此答复的函数可以知道该函数失败而没有错误,但是这必须在整个链中进行以防止在本地抛出。 似乎很of肿。
使此代码膨胀且IDE抱怨的唯一原因不是抛出错误,而是:
try {
//...
} catch (error) {
throw error;
}
这是没有操作。 您可以安全地删除它,而无需更改逻辑。
唯一应该使用catch
是,当您实际计划处理错误并使执行回到正轨时。
在仔细研究为什么不行之后,这是有道理的,不应将错误用于流量控制
我不同意。 错误是适当的流控制的一部分,它们使您可以处理计划外的事情。 在这种情况下,如果发生意外,则抛出错误也是有意义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.