NodeJS 如何为fs.readFileSync()捕获无文件?

t98cgbkg  于 2022-12-26  发布在  Node.js
关注(0)|答案(6)|浏览(515)

在node.js中,readFile()显示了如何捕获错误,但是没有关于readFileSync()函数错误处理的注解。因此,如果我尝试在没有文件的情况下使用readFileSync(),我会得到错误Error: ENOENT, no such file or directory
我如何捕获抛出的异常?文档没有说明抛出了什么异常,所以我不知道我需要捕获什么异常。我应该注意到我不喜欢try/catch语句的通用“捕获每个可能的异常”样式。在这种情况下,我希望捕获当文件不存在时发生的特定异常,并尝试执行readFileSync。
请注意,我只在服务连接尝试之前启动时执行同步功能,因此不需要评论我不应该使用同步功能:-)

e7arh2l6

e7arh2l61#

基本上,fs.readFileSync在找不到文件时会抛出一个错误,这个错误来自Error原型,使用throw抛出,因此唯一的捕获方法是使用try / catch块:

var fileContents;
try {
  fileContents = fs.readFileSync('foo.bar');
} catch (err) {
  // Here you get the error when the file was not found,
  // but you also get any other error
}

不幸的是,您无法仅通过查看其原型链来检测抛出了哪个错误:

if (err instanceof Error)

这是您所能做的最好的选择,而且对于大多数(如果不是全部)错误都是如此,因此我建议您使用code属性并检查其值:

if (err.code === 'ENOENT') {
  console.log('File not found!');
} else {
  throw err;
}

这样,您就可以只处理这个特定的错误,并重新抛出所有其他错误。
或者,您也可以访问错误的message属性以验证详细的错误消息,在本例中为:

ENOENT, no such file or directory 'foo.bar'
9cbw7uwe

9cbw7uwe2#

我比较喜欢这样的处理方式,可以检查文件是否同步存在:

var file = 'info.json';
var content = '';

// Check that the file exists locally
if(!fs.existsSync(file)) {
  console.log("File not found");
}

// The file *does* exist
else {
  // Read the file and do anything you want
  content = fs.readFileSync(file, 'utf-8');
}

注意:如果你的程序也删除文件,这有一个在注解中提到的竞态条件。但是如果你只写或覆盖文件,而不删除它们,那么这是完全可以的。

juzqafwq

juzqafwq3#

您必须捕获错误,然后检查错误类型。

try {
  var data = fs.readFileSync(...)
} catch (err) {
  // If the type is not what you want, then just throw the error again.
  if (err.code !== 'ENOENT') throw err;

  // Handle a file-not-found error
}
cuxqih21

cuxqih214#

我在这些场景中使用立即调用的lambda:

const config = (() => {
  try {
    return JSON.parse(fs.readFileSync('config.json'));
  } catch (error) {
    return {};
  }
})();

async版本:

const config = await (async () => {
  try {
    return JSON.parse(await fs.readFileAsync('config.json'));
  } catch (error) {
    return {};
  }
})();
70gysomp

70gysomp5#

JavaScript try ... catch机制不能用来拦截异步API产生的错误。初学者的一个常见错误是试图在错误优先回调中使用throw:

// THIS WILL NOT WORK:
const fs = require('fs');

try {
  fs.readFile('/some/file/that/does-not-exist', (err, data) => {
    // Mistaken assumption: throwing here...
    if (err) {
      throw err;
    }
  });
} catch (err) {
  // This will not catch the throw!
  console.error(err);
}

这将不起作用,因为传递给fs.readFile的回调函数()被异步调用。调用回调时,周围的代码(包括try ... catch块)将已退出。在大多数情况下,在回调中引发错误可能会使Node.js进程崩溃。如果启用了域,或者已向process.on注册了处理程序('uncaughtException '),则可以拦截此类错误。
参考:https://nodejs.org/api/errors.html

h5qlskok

h5qlskok6#

尝试使用Async来避免阻塞NodeJS的唯一线程。

const util = require('util');
const fs = require('fs');
const path = require('path');
const readFileAsync = util.promisify(fs.readFile);

const readContentFile = async (filePath) => {
  // Eureka, you are using good code practices here!
  const content = await readFileAsync(path.join(__dirname, filePath), {
    encoding: 'utf8'
  })
  return content;
}

以后可以将此异步函数与来自任何其他函数的try/catch一起使用:

const anyOtherFun = async () => {
  try {
    const fileContent = await readContentFile('my-file.txt');
  } catch (err) {
    // Here you get the error when the file was not found,
    // but you also get any other error
  }
}

快乐编码!

相关问题