node.js는 싱글 스레드로 동작하기 때문에 에러가 발생하면 스레드가 멈추고 결국 node.js 프로세스 전체가 멈추는 결과를 가져오게 됩니다. 따라서 어떤 처리를 수행할 때는 에러가 적절히 처리되도록 구현해 주는 것이 필요합니다.
try {
const i = 10;
i = 20; //에러 const는 변경할 수 없음
}
catch (err) {
console.error(err);
}
만약 node.js가 서버에서 실행되고 있고 어떤 코드를 지속적으로 반복해서 실행해야 하는 경우 에러가 발생한다고 가정하면 결국 서비스가 멈추게되는 상황을 보게 됩니다. 하지만 오류 발생 가능성이 있는 코드를 try ~ catch로 묶게 되면 에러가 발생했을 때 catch로 넘기게 되고 다음 처리를 계속 수행할 수 있게 됩니다.
그러나 굳이 try ~ catch로 묶지 않아도 되는 예외적인 경우도 있는데
const fs = require('fs');
fs.readFile('./test.txt', (err, data) => {
if (err) {
console.error(err);
}
console.log(data.toString());
});
위와 같이 비동기 콜백함수를 사용하는 경우입니다. 이때는 콜백 함수에서 에러 객체를 따로 넘겨주기도 하는데 필요하다면 err 객체를 받아 console.error(err)처럼 별도로 오류 룰 처리할 수 있습니다.
다만 promise의 경우에는 try ~ catch로 묶어줘야 합니다. 그렇게 하지 않아도 스레드가 멈추지 않을 수 있는데 향후 올라가는 버전에서는 try ~ catch로 해줘야 스레드가 죽지 않을 가능성이 있습니다.
코드마다 일일이 try ~ catch로 묶어주는 것이 불편하다면 process에 에러 이벤트를 붙여 모든 에러가 한곳에서 처리될 수 있도록 전역 에러 처리를 구현할 수도 있습니다.
process.on('uncaughtException', (err) => {
console.error(err);
});
그러나 이러한 경우에도 node.js에서는 모든 콜백함수에서 해당 에러를 거친다고 보장하지 않으므로 이 부분에 대한 주의가 필요합니다.
'Server > node.js' 카테고리의 다른 글
[node.js] 패키지 관리 (0) | 2021.03.04 |
---|---|
[node.js] http (0) | 2021.03.04 |
[node.js] 이벤트 처리 (0) | 2021.03.03 |
[node.js] 설치 (Windows WSL2) (0) | 2021.03.03 |
[node.js] fs (파일시스템 다루기) (0) | 2021.03.03 |