Jak przechwycić żaden plik dla fs.readFileSync()?

Wewnątrz węzła.js readFile()pokazuje jak wychwycić błąd, jednak nie ma komentarza dla funkcji readFileSync() odnośnie obsługi błędów. W związku z tym, jeśli próbuję użyć readFileSync (), gdy nie ma pliku, dostaję błąd Error: ENOENT, no such file or directory.

Jak uchwycić wyrzucony wyjątek? Doco nie podaje, jakie wyjątki są wyrzucane, więc nie wiem, jakie wyjątki muszę złapać. Powinienem zauważyć, że nie lubię ogólnych "złapać każdy możliwy wyjątek" styl wypowiedzi try/catch. W tym przypadku chcę złapać konkretny wyjątek, który występuje, gdy plik nie istnieje i próbuję wykonać readFileSync.

Proszę pamiętać, że wykonuję funkcje synchronizacji tylko przy starcie przed obsługą prób połączenia, więc komentarze, że nie powinienem używać funkcji synchronizacji, nie są wymagane: -)

Author: vishal_g, 2013-01-18

4 answers

Zasadniczo, fs.readFileSync wyświetla błąd, gdy plik nie zostanie znaleziony. Ten błąd pochodzi z Error prototypu i jest wyrzucany za pomocą throw, stąd jedynym sposobem na złapanie jest blok 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
}

Niestety nie można wykryć, który błąd został wyrzucony po prostu patrząc na jego łańcuch prototypów:

if (err instanceof Error)

To najlepsze, co możesz zrobić, i będzie to prawdą dla większości (jeśli nie wszystkich) błędów. Dlatego sugerowałbym, abyś wybrał code właściwość i sprawdził jej wartość:

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

Tędy, zajmujesz się tylko tym konkretnym błędem i ponownie rzucasz wszystkie inne błędy.

Alternatywnie, można również uzyskać dostęp do właściwości message błędu, aby zweryfikować szczegółowy komunikat o błędzie, który w tym przypadku jest:

ENOENT, no such file or directory 'foo.bar'
Mam nadzieję, że to pomoże.
 146
Author: Golo Roden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-20 09:53:34

Chociaż przyjęte rozwiązanie jest w porządku, znalazłem dużo lepszy sposób na poradzenie sobie z tym. Możesz po prostu sprawdzić, czy plik istnieje synchronicznie:

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(this.local, 'utf-8');
}
 15
Author: Francisco Presencia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-27 04:33:55

Musisz wyłapać błąd, a następnie sprawdzić, jaki to jest typ błędu.

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
}
 8
Author: loganfsmyth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 20:03:20

Używam natychmiast wywołanego lambda dla tych scenariuszy:

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

async Wersja:

const config = await (async () => {
  try {
    return JSON.parse(await fs.readFileAsync('config.json'));
  } catch (error) {
    return {};
  }
})();
 3
Author: sdgfsdh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-05 13:02:59