#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");
}
}