【问题标题】:Exception slips through try...catch in Javascript异常通过 try...catch 在 Javascript 中溜走
【发布时间】:2017-03-17 09:59:39
【问题描述】:

我在 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()。但我认为这个异常会通过调用函数向上传播并且可以在那里被捕获——因此configure() 中的try...catch

我不想解决loadFileSync() 中的异常,因为它在其他地方使用并且调用loadFileSync() 的函数将以不同的方式处理异常。那么,一般来说,防止文件未在此处找到和冒泡异常的正确方法是什么?

【问题讨论】:

  • 你可以尝试一下吗:将 try/catch 放入 loadFileSync,然后在 catch 中抛出同样的错误。这样,您将 try/catch 放在 accessSync 上,然后抛出的错误将被 configure 捕获。不确定它会起作用
  • 是的,尝试...抓住 fs.accessSync() 会有所帮助。但我真的不知道它为什么起作用以及做它的一般方法是什么。如果您能详细说明,我将不胜感激。
  • 好吧,我不能对“accessSync”方法的实现发表太多评论,我相信该实现会引发一些未处理的错误,实际上并不是同步,而是一个循环,因此你无法得到错误但在 try/catch 中封装相同的方法会强制捕获任何未处理的错误。
  • 如果修复有效,请接受答案,以便对其他人有所帮助。 :)

标签: javascript node.js exception fs


【解决方案1】:

试试这个:

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 方法本身的实现。

【讨论】:

  • 是的,这解决了问题。不过,我不知道为什么。也许您对 accessSync 实现是正确的。很抱歉延迟接受它,我希望有人能提供完全解释问题的答案。
【解决方案2】:

如果我正确理解了您的问题,这里有两种处理异常的方法。

方法一:使用 Promise

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);
        });
      }
    }

方法二:使用回调

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);
  }
}

希望你觉得它有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 2011-09-16
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2011-03-18
    相关资源
    最近更新 更多