在Javascript

时间:2017-03-17 09:59:39

标签: javascript node.js exception fs

在正确的应用程序启动之前,我在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()的函数则以不同方式处理异常。那么,什么是防止文件未找到的正确方法和一般冒泡异常的正确方法?

2 个答案:

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