Управление потоком с асинхронным без выдачи ошибок - PullRequest
0 голосов
/ 12 января 2019

У меня проблема с тем, что Intellij предупреждает меня о 'throw' исключении, пойманном локально . После некоторого выяснения, почему это не нормально, это имеет смысл, ошибки не должны использоваться для управления потоком. Однако проблема, с которой я сталкиваюсь, заключается в асинхронности. Я не могу отклонить обещание, не бросив что-то локально, и я получаю предупреждение.

Некоторые из моих примеров кода.

Верхний уровень принимает запрос и ожидает ответа от контроллера:

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; 
    }
}

Тогда у меня есть функция, которая получает идентификатор производителя для этого элемента, и я сталкиваюсь с моей проблемой. Если 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 голосов
/ 12 января 2019

Единственное, что делает этот код раздутым и IDE жалуется, это не выдача ошибок, а это:

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

Это не оп. Вы можете безопасно удалить его, не меняя логику.

Единственный случай, когда вы должны использовать catch, это когда вы действительно планируете обработать ошибку и вернуть выполнение в нужное русло.

После некоторого выяснения, почему это не нормально, имеет смысл, ошибки не должны использоваться для управления потоком

Я не согласен. Ошибки являются частью правильного управления потоком, они позволяют вам обрабатывать незапланированные вещи. Выдача ошибки, если произошло что-то неожиданное, имеет смысл, и в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...