обработка нескольких ошибок в Node js

#javascript #node.js #error-handling #try-catch

#javascript #node.js #обработка ошибок #попробуйте-поймайте

Вопрос:

У меня есть метод в Node JS, который считывает файл, содержащий данные JSON, и находит продукт с определенным идентификатором.

 async getProductwithId(id) {
        try {
            let rawData = fs.readFileSync("data/products.json");
            let data = JSON.parse(rawData);
            for (const element of data) {
                if (id === element.productId) {
                    return element;
                }
            }
            throw new ProductDoesNotExistError("No Such Product Exists");
        } catch (error) {
            throw new FileReadingError("Error Reading File");
        }
    }
  

где ProductDoesNotExistError и FileReadingError оба расширяют ошибку. Я поставил try / catch для fs.readFileSync()

проблема в том, что даже если у меня есть ProductDoesNotExistError, он отправляет FileReadingError. Я хочу обработать здесь только FileReadingError, а не ProductDoesNotExistError. Я позволю вызывающей функции обрабатывать ошибку ProductDoesNotExistError. Как мне достичь этой функциональности.

Ответ №1:

Поскольку в вашем блоке catch вы создаете новый экземпляр FileReadingError , все обнаруженные ошибки приведут к последнему. Вы могли бы либо поместить try/catch только вокруг readFileSync операции, либо проверить тип ошибки в вашем блоке catch (также в этом нет необходимости, async поскольку код внутри метода не является асинхронным — например, вы не используете fs.promises.readFile() ):

 getProductwithId(id) {
    let rawData;
    try {
        rawData = fs.readFileSync("data/products.json");
    } catch (error) {
        throw new FileReadingError("Error Reading File");
    }
    const data = JSON.parse(rawData);
    for (const element of data) {
        if (id === element.productId) {
            return element;
        }
    }
    throw new ProductDoesNotExistError("No Such Product Exists");
}
  

или вы делаете:

 getProductwithId(id) {
    try {
        const rawData = fs.readFileSync("data/products.json");
        const data = JSON.parse(rawData);
        for (const element of data) {
            if (id === element.productId) {
                return element;
            }
        }
        throw new ProductDoesNotExistError("No Such Product Exists");
    } catch (error) {
        if (error instanceof ProductDoesNotExistError) {
            // rethrow ProductDoesNotExistError error
            throw error;
        }
        throw new FileReadingError("Error Reading File");
    }
}