异步进行流控制而不会引发错误

时间:2019-01-11 22:04:46

标签: javascript async-await

我遇到了一个问题,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;
    }
}

我的问题是我知道我可以调整它,以便其他得到此答复的函数可以知道此函数失败而没有错误,但是这必须在整个链中进行以防止在本地抛出。似乎很肿。

1 个答案:

答案 0 :(得分:0)

唯一使此代码过大且IDE抱怨的不是抛出错误,而是:

 try {
   //...
 } catch (error) {
   throw error;
 }

没有操作。您可以安全地删除它,而无需更改逻辑。

唯一应使用catch的情况是您实际计划处理错误并使执行重新回到正轨的情况。

  

仔细研究为什么不行是合理的之后,不应将错误用于流量控制

我不同意。错误是适当的流控制的一部分,它们使您可以处理计划外的事情。在这种情况下,如果发生意外情况也可以抛出错误。