Javascript中的try…catch出现异常
我在节点中有一个子例程,用于在正确的应用程序启动之前加载配置等。事实证明,如果找不到文件,则无法捕获异常并中断应用程序 相关代码:Javascript中的try…catch出现异常,javascript,node.js,exception,fs,Javascript,Node.js,Exception,Fs,我在节点中有一个子例程,用于在正确的应用程序启动之前加载配置等。事实证明,如果找不到文件,则无法捕获异常并中断应用程序 相关代码: const fs = require('fs'); class FileParser { static configure(filename) { let file; try { file = this.loadFileSync(filename); } catch (err) {
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()。但是我认为这个异常会通过调用函数向上传播,并且可以在那里被捕获-因此configure()
中的try…catch
我不想解决
loadFileSync()
中的异常,因为它在其他地方使用,调用loadFileSync()
的函数将以不同的方式处理异常。那么,什么是防止文件在这里找不到和冒泡异常的正确方法呢?如果我正确理解了您的问题,有两种方法可以处理这里的异常
方法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);
}
}
希望你觉得它有用 试试这个:
const fs=require('fs');
类文件解析器{
静态配置(文件名){
让文件;
试一试{
file=this.loadFileSync(文件名);
}捕捉(错误){
log(`File${filename}未找到`);
}
// ...
}
静态加载文件同步(文件名){
试一试{
accessSync(文件名,fs.F_OK);
}捕获(错误){
抛出(错误);
}
返回fs.readFileSync(文件名为“utf8”);
}
}
可以尝试:将try/catch放入loadFileSync,然后在catch内抛出相同的错误。这样,您将try/catch放在accessSync上,然后抛出的错误将被configure捕获。不确定它是否有效是的,请尝试…了解fs.accessSync()的帮助。但我真的不知道为什么它会起作用,一般的方法是什么。如果您能详细说明,我将不胜感激。我不能对“accessSync”的实现做太多评论方法,我认为该实现抛出了一些未处理的错误,实际上不是同步而是一个循环,因此您无法获取错误,而是将相同的方法封装在try/catch forces中以捕获任何未处理的错误。如果修复有效,请接受答案,以便帮助其他人。:)是的,这就解决了问题。不过,我不知道为什么。关于accessSync实现,您可能是对的。很抱歉延迟接受,我希望有人能提供充分解释问题的答案。