Как записать файл на FS.readFileSync ()?
внутри узла.js readFile () показывает, как захватить ошибку, однако нет комментариев для readFileSync () функция, касающаяся обработки ошибок. Таким образом, если я пытаюсь использовать readFileSync (), когда нет файла, я получаю ошибку Error: ENOENT, no such file or directory.
Как я могу захватить исключение выбрасывается? Doco не указывает, какие исключения выбрасываются, поэтому я не знаю, какие исключения мне нужно поймать. Я должен отметить, что мне не нравится generic ' catch every single возможное исключение ' стиль операторов try / catch. В этом случае я хочу поймать конкретное исключение, которое возникает, когда файл не существует, и я пытаюсь выполнить readFileSync.
обратите внимание, что я выполняю функции синхронизации только при запуске перед подачей попыток подключения, поэтому комментарии, которые я не должен использовать функции синхронизации, не требуются : -)
4 ответов:
по сути,
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'надеюсь, что это помогает.
хотя принятое решение в порядке, я нашел гораздо лучший способ справиться с этим. Вы можете просто проверить, существует ли файл синхронно:
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'); }
вы должны поймать ошибку, а затем проверить, какой тип ошибки он.
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 }
Я использую немедленно вызванную лямбду для этих сценариев:
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 {}; } })();
Comments