W module node.js readFile () pokazuje, jak przechwycić błąd, jednak funkcja readFileSync () nie zawiera komentarza dotyczącego obsługi błędów. W związku z tym, jeśli spróbuję użyć readFileSync (), gdy nie ma pliku, pojawia się błąd Error: ENOENT, no such file or directory
.
Jak uchwycić zgłaszany wyjątek? Dokument doco nie określa, jakie wyjątki są generowane, więc nie wiem, jakie wyjątki muszę przechwycić. Powinienem zauważyć, że nie podoba mi się ogólny styl instrukcji try / catch typu „złap każdy możliwy wyjątek”. W tym przypadku chcę złapać określony wyjątek, który występuje, gdy plik nie istnieje i próbuję wykonać readFileSync.
Pamiętaj, że wykonuję funkcje synchronizacji tylko podczas uruchamiania przed obsługą prób połączenia, więc komentarze, że nie powinienem używać funkcji synchronizacji, nie są wymagane :-)
źródło
fs.existsSync()
co widać w mojej nowej odpowiedziOdpowiedzi:
Zasadniczo
fs.readFileSync
zgłasza błąd, gdy plik nie zostanie znaleziony. Ten błąd pochodzi zError
prototypu i został wyrzucony za pomocąthrow
, stąd jedynym sposobem na złapanie jesttry / catch
blok: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żesz wykryć, który błąd został zgłoszony, 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ą w przypadku większości (jeśli nie wszystkich) błędów. Dlatego proponuję udać się z
code
nieruchomością i sprawdzić jej wartość:if (err.code === 'ENOENT') { console.log('File not found!'); } else { throw err; }
W ten sposób zajmujesz się tylko tym konkretnym błędem i ponownie zgłaszasz wszystkie inne błędy.
Alternatywnie możesz również uzyskać dostęp do
message
właściwości błędu, aby zweryfikować szczegółowy komunikat o błędzie, którym w tym przypadku jest:ENOENT, no such file or directory 'foo.bar'
Mam nadzieję że to pomoże.
źródło
EACCES
kod należy sprawdzać w instrukcji if w przypadku, gdy plik jest tam, ale nie można odczytać z powodu braku uprawnieńWolę ten sposób radzenia sobie z tym. Możesz 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(file, 'utf-8'); }
źródło
files
ze wszystkim, czego się nauczyłem, aby ułatwić asynchronizację i try / catch.Musisz wyłapać błąd, a następnie sprawdzić, jakiego rodzaju jest to błąd.
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 }
źródło
Używam natychmiast wywołanej lambdy w następujących scenariuszach:
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 {}; } })();
źródło
fs
jest to moduł węzłafs.readFileAsync()
jest terazfs.readFile()
i również nie powinno umieszczać funkcji asynchronicznej wewnątrz try / catch w node.js. metoda try / catch nigdy nie otrzyma błędu, ponieważ jest asynchroniczna. zamiast tego przekaż błąd w wywołaniu zwrotnym i obsłuż go tam:fs.readFile('/etc/passwd', (err, data) => { if (err) throw err; console.log(data); });
from: nodejs.org/dist/latest-v12.x/docs/api/…Spróbuj zamiast tego użyć Async, aby uniknąć blokowania jedynego wątku, który masz w NodeJS. Sprawdź ten przykład:
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; }
Później można użyć tej funkcji asynchronicznej z try / catch z dowolnej innej funkcji:
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 } }
Miłego kodowania!
źródło
Mechanizmu JavaScript try… catch nie można używać do przechwytywania błędów generowanych przez asynchroniczne interfejsy API. Częstym błędem dla początkujących jest próba użycia metody throw wewnątrz wywołania zwrotnego w pierwszej kolejności błędu:
// 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); }
To nie zadziała, ponieważ funkcja wywołania zwrotnego przekazana do fs.readFile () jest wywoływana asynchronicznie. Zanim wywołanie zwrotne zostanie wywołane, otaczający kod, w tym blok try… catch, będzie już zakończony. W większości przypadków zgłoszenie błędu w wywołaniu zwrotnym może spowodować zawieszenie procesu Node.js. Jeśli domeny są włączone lub program obsługi został zarejestrowany w process.on („uncaughtException”), takie błędy mogą zostać przechwycone.
źródło: https://nodejs.org/api/errors.html
źródło