在正确的应用程序启动之前,我在Node中有一个子程序来加载配置等。事实证明,如果找不到文件,则无法捕获异常并破坏应用程序。
相关代码:
const fs = require('fs');
class FileParser {
static configure(filename) {
let file;
try {
file = this.loadFileSync(filename);
} catch (err) {
console.log(`File ${filename} not found`);
}
// ...
}
static loadFileSync(filename) {
fs.accessSync(filename, fs.F_OK);
return fs.readFileSync(filename, 'utf8');
}
}
如果找不到文件,fs.accessSync()
将抛出异常。很好,因为它可以保护fs.readFileSync()
。但我认为这个异常会通过调用函数传播,并且可以在那里捕获 - 因此try...catch
中的configure()
。
我不想解决loadFileSync()
中的异常,因为它在别处使用,而调用loadFileSync()
的函数则以不同方式处理异常。那么,什么是防止文件未找到的正确方法和一般冒泡异常的正确方法?
答案 0 :(得分:0)
如果我理解你的问题,你可以通过两种方式处理异常。
方法1:使用承诺
class FileParser {
static configure(filename) {
let file;
loadFileSync(filename).then(function(result){
// 'result' will contain whatever you have
// resolved in loadFileSync promise
file = result;
}).catch(function(err){
// Handle err here
});
}
static loadFileSync(filename) {
return new Promise(function(resolve, reject) {
fs.accessSync(filename, fs.F_OK);
// Check if everything is ok.
// If yes
return resolve(fs.readFileSync(filename, 'utf8'));
// Else
return reject(err);
});
}
}
方法2:使用回调
class FileParser {
static configure(filename) {
let file;
this.loadFileSync(filename, function(err, result) {
if (err) {
console.log(`File ${filename} not found`);
// return or throw
}
file = result;
});
}
static loadFileSync(filename, cb) {
fs.accessSync(filename, fs.F_OK);
// Check if everything is ok.
// If yes
return cb(null, fs.readFileSync(filename, 'utf8'));
// Else
return cb(err);
}
}
希望你觉得它很有用!
答案 1 :(得分:0)
试试这个:
const fs = require('fs');
class FileParser {
static configure(filename) {
let file;
try {
file = this.loadFileSync(filename);
} catch (err) {
console.log(`File ${filename} not found`);
}
// ...
}
static loadFileSync(filename) {
try {
fs.accessSync(filename, fs.F_OK);
} catch(error) {
throw(error);
}
return fs.readFileSync(filename, 'utf8');
}
}

这可能会解决问题,而您遇到此问题的原因可能是因为accessSync方法本身的实现。