166

node.js内でreadFile()はエラーをキャプチャする方法を示していますが、エラー処理に関するreadFileSync()関数についてのコメントはありません。そのため、ファイルがないときにreadFileSync()を使用しようとすると、エラーが発生しますError: ENOENT, no such file or directory

スローされた例外をキャプチャするにはどうすればよいですか?ドコはどの例外がスローされるかを述べていないので、どの例外をキャッチする必要があるのか​​わかりません。私は、try/catchステートメントの一般的な「すべての可能な例外をキャッチする」スタイルが好きではないことに注意する必要があります。この場合、ファイルが存在しないときに発生する特定の例外をキャッチして、readFileSyncを実行しようとします。

接続試行を提供する前の起動時にのみ同期機能を実行していることに注意してください。したがって、同期機能を使用すべきではないというコメントは必要ありません:-)

4

6 に答える 6

246

基本的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'

お役に立てれば。

于 2013-01-18T04:10:46.810 に答える
30

私はこれを処理するこの方法を好みます。ファイルが同期的に存在するかどうかを確認できます。

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

注:プログラムがファイルも削除する場合、コメントに記載されているように、これには競合状態があります。ただし、ファイルを削除せずに書き込みまたは上書きするだけの場合は、これで問題ありません。

于 2015-09-27T04:33:55.390 に答える
17

エラーをキャッチしてから、エラーの種類を確認する必要があります。

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
}
于 2013-01-18T04:06:56.030 に答える
6

これらのシナリオでは、すぐに呼び出されるラムダを使用します。

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 {};
  }
})();
于 2017-11-28T12:30:36.273 に答える
1

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

于 2020-06-26T08:26:19.547 に答える
-1

代わりに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
  }
}

ハッピーコーディング!

于 2019-12-15T03:44:58.373 に答える