Comment capturer aucun fichier pour fs.readFileSync ()?

Dans le fichier node.js, readFile () montre comment capturer une erreur, mais la fonction readFileSync () ne contient aucun commentaire sur la gestion des erreurs. En tant que tel, si j’essaie d’utiliser readFileSync () quand il n’y a pas de fichier, j’obtiens l’erreur Error: ENOENT, no such file or directory .

Comment puis-je capturer l’exception lancée? Le doco n’indique pas quelles exceptions sont levées, donc je ne sais pas quelles exceptions je dois attraper. Je dois noter que je n’aime pas le style générique “attrapez chaque exception possible” des instructions try / catch. Dans ce cas, je souhaite intercepter l’exception spécifique qui se produit lorsque le fichier n’existe pas et que j’essaie d’effectuer readFileSync.

Veuillez noter que j’effectue des fonctions de synchronisation uniquement au démarrage avant de servir les tentatives de connexion, donc les commentaires que je ne devrais pas utiliser sur les fonctions de synchronisation ne sont pas requirejs 🙂

Fondamentalement, fs.readFileSync génère une erreur lorsqu’un fichier est introuvable. Cette erreur provient du prototype d’ Error et a été lancée à l’aide de throw , la seule façon de l’attraper est d’utiliser un bloc 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 } 

Malheureusement, vous ne pouvez pas détecter quelle erreur a été générée en regardant simplement sa chaîne de prototypes:

 if (err instanceof Error) 

est le meilleur que vous pouvez faire, et cela sera vrai pour la plupart des erreurs (sinon toutes). Je vous suggère donc d’aller avec la propriété code et de vérifier sa valeur:

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

De cette façon, vous ne traitez que cette erreur spécifique et relancez toutes les autres erreurs.

Vous pouvez également accéder à la propriété message l’erreur pour vérifier le message d’erreur détaillé, qui dans ce cas est:

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

J’espère que cela t’aides.

Bien que la solution acceptée soit acceptable, j’ai trouvé une meilleure façon de gérer cela. Vous pouvez simplement vérifier si le fichier existe de manière synchrone:

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

Vous devez détecter l’erreur et vérifier le type d’erreur.

 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 } 

J’utilise un lambda immédiatement invoqué pour ces scénarios:

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

version async :

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