我有一个从文件读取的基本代码,我想处理诸如无法打开文件之类的错误。下面是我的代码:
async function processFile() {
const fileStream = fs.createReadStream(source);
fileStream.on('error', function(err) {
console.log("An error occured while opening the file")
throw err
//return Promise.reject(err)
//return
});
}
async function main(){
try{
await processFile();
} catch(err){
console.error("catching error")
return
}
}
main()
我通常得到这样的结果:
An error occured while opening the file
catching error
node:internal/process/promises:289
triggerUncaughtException(err, true /* fromPromise */);
^
[Error: ENOENT: no such file or directory, open 'source.tx'] {
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: 'source.tx'
}
Node.js v19.2.0
所以你可以看到,两个自定义消息都正确显示,但我仍然得到错误块,无论我使用throw或reject()
代码的问题是什么,我如何解决它?
谢谢。
将函数标记为async
不会使其自动处理嵌套函数中的错误
创建一个新的promise并使用reject
函数参数拒绝错误
function processFile() {
return new Promise((resolve, reject) => {
const fileStream = fs.createReadStream(source);
fileStream.on("error", function (err) {
console.log("An error occured while opening the file");
reject(err);
});
});
}
async function main() {
try {
await processFile();
} catch (err) {
console.error("catching error");
return;
}
}
main();
另一种处理流错误的方法是使用finished
方法。
根据doc:
当一个流不再可读、可写或发生错误或过早关闭事件时得到通知的函数。
在你的例子中:
const { finished } = require('stream/promises');
async function processFile() {
const fileStream = fs.createReadStream(source);
return finished(fileStream)
}
async function main(){
try{
await processFile();
} catch(err){
console.error("catching error", err)
return
}
}
main()
或者如果您想在错误范围内使用其他逻辑(例如:日志记录、…):
async function processFile() {
const fileStream = fs.createReadStream(source);
return finished(fileStream).catch((error) => {
console.log('An error occured while opening the file');
throw error;
})
...