fs.readFileSync() 파일을 캡처하지 않는 방법은 무엇입니까?
node.js readFile() 내에는 오류를 캡처하는 방법이 표시되지만 오류 처리와 관련하여 readFileSync() 함수에 대한 설명은 없습니다.따라서 파일이 없을 때 readFileSync()를 사용하려고 하면 다음 오류가 발생합니다.Error: ENOENT, no such file or directory
.
던져지는 예외를 캡처하려면 어떻게 해야 합니까?도코에는 어떤 예외가 있는지 명시되어 있지 않기 때문에 어떤 예외를 잡아야 할지 모르겠습니다.저는 일반적인 '모든 가능한 예외 포착' 스타일의 시도/획득 문을 좋아하지 않습니다.이 경우 파일이 존재하지 않고 readFileSync를 수행하려고 할 때 발생하는 특정 예외를 파악하려고 합니다.
연결 시도를 제공하기 전에 시작할 때만 동기화 기능을 수행하므로 동기화 기능을 사용하면 안 된다는 의견은 필요하지 않습니다 :-)
기본적으로,fs.readFileSync
파일을 찾을 수 없는 경우 오류를 발생시킵니다.이 오류는 다음에서 발생했습니다.Error
프로토타입 및 다음을 사용하여 던집니다.throw
따라서 잡을 수 있는 유일한 방법은 a와 함께 하는 것입니다.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(file, '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 {};
}
})();
JavaScript try…catch 메커니즘을 사용하여 비동기 API에 의해 생성된 오류를 가로챌 수 없습니다.초보자의 일반적인 실수는 오류 우선 콜백 내부에서 스로우를 사용하려고 시도하는 것입니다.
// 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);
}
전달된 tofs.readFile() 콜백 함수가 비동기식으로 호출되기 때문에 작동하지 않습니다.콜백이 호출되었을 때 try…catch 블록을 포함한 주변 코드는 이미 종료되었습니다.대부분의 경우 콜백 내부에 오류를 던지면 Node.js 프로세스가 손상될 수 있습니다.도메인이 활성화되었거나 처리기가 process.on('uncaughtException')에 등록된 경우 이러한 오류를 가로챌 수 있습니다.
참조: https://nodejs.org/api/errors.html
대신 비동기를 사용하여 NodeJS에 있는 유일한 스레드를 차단하지 않도록 하십시오.다음 예를 확인합니다.
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;
}
나중에 이 비동기 함수를 다른 함수에서 try/catch와 함께 사용할 수 있습니다.
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
}
}
해피 코딩!
언급URL : https://stackoverflow.com/questions/14391690/how-to-capture-no-file-for-fs-readfilesync
'programing' 카테고리의 다른 글
mysql 쿼리를 통해 하나의 열을 다른 열로 복사 (0) | 2023.09.04 |
---|---|
Swift에서 UI 텍스트 필드의 최대 문자 길이 설정 (0) | 2023.09.04 |
json 수신 및 spring mvc 컨트롤러에서 객체 목록으로 역직렬화 (0) | 2023.09.04 |
현재 클래스의 이름을 가져오시겠습니까? (0) | 2023.09.04 |
Swift용 Xcode에서 코드 포맷터를 사용하는 방법은 무엇입니까? (0) | 2023.09.04 |