我在Node JS中有一个方法,该方法读取包含JSON数据的文件并查找具有特定ID的产品。
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都扩展了Error。我已经为fs.readFileSync()尝试/捕获了问题是即使我有ProductDoesNotExistError,它也会发送FileReadingError。我只想在这里处理FileReadingError而不是ProductDoesNotExistError。我将让callling函数处理ProductDoesNotExistError。如何实现此功能。
最佳答案
由于在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");
}
}