노드 오류 처리

예외: 처리되지 않은 오류

  • 노드 스레드를 중지합니다.

  • 노드는 기본적으로 단일 스레드이므로 스레드가 중지되면 프로세스가 중지됩니다.

  • 오류 처리는 필수적입니다.

기본적으로 예외는 try catch 문으로 처리됩니다.

  • 오류가 발생할 수 있는 위치는 try catch로 래핑됩니다.

//error1.js
setInterval(() => {
  console.log('시작');
  try {
    throw new Error('서버를 고장내주마!
'); } catch (err) { console.error(err); } }, 1000);

JavaScript의 try 및 catch 문과 유사합니다.

던지는 것은 의도적으로 오류를 던지는 것입니다.

오류가 발생한 위치는 try 및 catch 문으로 래핑됩니다.

try 문에서 오류가 발생하여 내용을 catch 문에 인수로 전달한 것을 확인할 수 있습니다.

catch는 오류가 아닌 것처럼 처리합니다.

따라서 에러가 발생하더라도 전체적으로는 에러가 발생하지 않은 것으로 취급합니다.

출력 문을 보면 다음과 같습니다.


1초마다 계속 반복되는 것을 볼 수 있습니다.

오류가 발생하면 프로그램이 멈춰야 하는데 try, catch 문이 이를 처리하므로 오류가 발생해도 프로그램이 멈추지 않고 계속 실행되는 것을 확인할 수 있다.

* 반복을 중지하려면 ctrl + c를 누르십시오.

노드 비동기 메서드에서 오류를 처리할 필요가 없습니다.

  • 콜백 함수가 오류 개체를 제공하기 때문입니다.

//error2.js
const fs = require('fs');

setInterval(() => {
  fs.unlink('./abcdefg.js', (err) => {
    if (err) {
      console.error(err);
    }
  });
}, 1000);

fs는 기본적으로 오류 개체를 제공하므로 try 및 catch 문을 사용할 필요가 없습니다.

단, 로그에 오류 메시지가 나타나야 하므로 console.error(err)와 같은 출력 문을 사용하여 처리한다.

(개발자가 오류 로그를 보고 고칠 수 있도록)

알아야 할 또 다른 사항 비동기 함수의 콜백 오류는 프로그램을 중지하지 않는다는 것입니다.

Promise의 오류를 별도로 처리할 필요가 없습니다.

  • 그러나 버전이 올라감에 따라 동작이 변경될 수 있습니다.

//error3.js
const fs = require('fs').promises;

setInterval(() => {
  fs.unlink('./abcdefg.js')
}, 1000);

Promise의 오류를 처리하지 않아도 오류 내용이 콘솔에 출력되고 프로그램이 멈추지 않았습니다.

*현재 노드 버전 18.13.0을 사용 중이며 위의 내용이 변경되었습니다.

이제 Promise에 대한 에러 처리 없이 프로그램을 실행하면 프로그램이 중지되는 것을 확인한 것입니다.

노드 버전 18.13.0으로 위 코드를 실행하면


위의 오류가 발생하고 프로그램이 중지됩니다.

Try and catch는 최후의 수단으로 사용하는 것이 가장 좋습니다.

  • 콜백 함수의 동작을 보증하지 않습니다.

    따라서 복구 작업에 사용하는 것은 부적절합니다.

  • 오류 내용을 기록하는 용도로만 사용하는 것이 좋습니다.

/error4.js
process.on('uncaughtException', (err) => {
  console.error('예기치 못한 에러', err);
});

setInterval(() => {
  throw new Error('서버를 고장내주마!
'); }, 1000); setTimeout(() => { console.log('실행됩니다'); }, 2000);

모든 함수에 대해 try 및 catch 문을 사용하는 것은 약간 무리가 있습니다.

uncaughtException을 사용하여 한 번에 오류를 처리하는 방법이 있습니다.

모든 오류는 uncaughtExceptiond로 이동합니다.


출력문을 보면 setInterval에서 오류가 발생했음에도 불구하고 프로그램은 멈추지 않고 계속 실행된다.

* 오류가 처리되었다고 해서 이것이 해결책이라고 생각하는 것은 옳지 않습니다.

프로그램에 오류가 있으면 실행될 때마다 오류가 발생하고 매번 uncaughtException이 실행됩니다.

오류 내용을 보고 빠르게 수정하는 것이 맞다.

즉, 오류 내용을 기록하는 용도로만 사용하는 것이 좋습니다.