Server/node.js

[node.js] 에러 핸들링

클리엘 2021. 3. 3. 16:35
728x90

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에서는 모든 콜백함수에서 해당 에러를 거친다고 보장하지 않으므로 이 부분에 대한 주의가 필요합니다.

728x90