예외
란 처리하지 못한 에러를 말한다.
멀티스레드 프로그램
의 경우 스레드 하나가 멈추면 그 일을 다른 스레드가 대신할 수 있지만, 노드는 단일스레드 프로그램
이기 때문에 에러로 인해 스레드 하나가 멈출 경우 서버 전체가 멈추게 된다.
따라서, 예외 처리
를 통해 에러 로그는 기록되되 작업은 계속 진행될 수 있도록 해야한다.
setInterval(() => {
console.log('시작');
try{
throw new Error('에러 발생');
}catch(err){
console.log(err);
}
},1000);
setInterval
을 이용해서 프로세스가 멈추는지 여부를 체크한다. 만약, 프로세스가 에러로 인해 멈추면 setInterval
도 멈추게 된다.
또한, setInterval
내부에 throw new Error()
로 에러를 강제로 발생시켜주었다.
시작
Error: 에러 발생
at Timeout._onTimeout (C:\Users\user\node Test\node.js_test\Test12\error1.js:4:15)
at listOnTimeout (node:internal/timers:559:17)
at processTimers (node:internal/timers:502:7)
시작
Error: 에러 발생
at Timeout._onTimeout (C:\Users\user\node Test\node.js_test\Test12\error1.js:4:15)
at listOnTimeout (node:internal/timers:559:17)
at processTimers (node:internal/timers:502:7)
(반복...)
하지만 결과로 보이는것 처럼, error는 계속 발생하지만 try~catch
절로 에러를 잡아주기 때문에 코드는 사용자가 직접 멈추기 전까지 계속 진행된다.
다음은 노드 자체에서 잡아주는 에러이다.
const fs = require('fs');
setInterval(() => {
fs.unlink('./node.js_test/Test12/abc.txt',(err) => {
if(err){
console.log(err);
}
});
},1000);
[Error: ENOENT: no such file or directory, unlink 'C:\Users\user\node Test\node.js_test\Test12\abc.txt'] {
errno: -4058,
code: 'ENOENT',
syscall: 'unlink',
path: 'C:\Users\user\node Test\node.js_test\Test12\abc.txt'
}
(반복...)
fs.unlink
로 없는 파일을 지워준다. 에러가 발생하기는 하지만, 노드 내장 모듈의 에러는 실행 중인 프로세스를 멈추지 않는다.
이 외의 에러는 try~catch
절을 이용해서 throw
한 에러를 잡아주어야한다.
다음은 예측 불가능한 에러를 처리하는 방법이다.
process.on('uncaughtException',(err) => {
console.error('예기치 못한 에러',err);
});
setInterval(() => {
throw new Error('에러 발생');
},1000);
setTimeout(() => {
console.log('실행됩니다.');
},2000);
예기치 못한 에러 Error: 에러 발생
at Timeout._onTimeout (C:\Users\user\node Test\node.js_test\Test12\error3.js:6:11)
at listOnTimeout (node:internal/timers:559:17)
at processTimers (node:internal/timers:502:7)
실행됩니다.
프로세스 객체에 uncaughtException
이벤트 리스너를 달아줬다. 처리하지 못한 에러가 발생했을 경우 이벤트 리스너가 실행되고 프로세스가 유지된다.
이 구문이 있기 때문에 setTimeout 구문이 작동될 수 있게 된다.(에러가 발생했지만 setInterval만 멈출뿐 나머지 코드는 정상 작동된다.)