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: -)
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.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');
}
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
}
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 {};
}
})();
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