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实现,您可能是对的。很抱歉延迟接受,我希望有人能提供充分解释问题的答案。