-
노드 에러 처리하기노드 2023. 4. 12. 17:37
예외(Exception) : 처리하지 못한 에러
- 노드 스레드를 멈춘다.
- 노드는 기본적으로 싱글 스레드라 스레드가 멈춘다는 것은 프로세스가 멈추는 것이다.
- 에러 처리는 필수이다.
기본적으로 try catch 문으로 예외를 처리한다.
- 에러가 발생할 만한 곳을 try catch로 감싼다.
//error1.js setInterval(() => { console.log('시작'); try { throw new Error('서버를 고장내주마!'); } catch (err) { console.error(err); } }, 1000);
자바스크립트의 try, catch 문과 비슷하다.
throw라는 것은 의도적으로 에러를 발생시키는 것이다. 에러가 발생하는 곳을 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) 등의 출력문으로 처리를 해준다. (그래야 에러 로그를 보고 개발자들이 고칠 수 있으니까)
또 하나 알 수 있는 것은 비동기 함수들의 콜백 에러는 프로그램을 멈추지 않는 점이다.
프로미스의 에러는 따로 처리하지 않아도 된다
- 단, 버전이 올라가면 동작이 바뀔 수 있다.
//error3.js const fs = require('fs').promises; setInterval(() => { fs.unlink('./abcdefg.js') }, 1000);
프로미스의 에러는 딱히 처리를 하지 않아도 콘솔에 에러 내용이 출력이 되고 프로그램이 멈추지 않았다.
*현재 저는 노드버전 18.13.0을 사용하고 있는데 위의 부분이 바뀌었습니다.
이제 프로미스에 아무런 에러 처리를 하지 않고 프로그램을 실행하면 프로그램이 멈추는 것을 확인 했습니다.
위의 코드를 노드 버전 18.13.0 으로 실행을 하면
위와 같은 에러가 발생하고 프로그램이 멈추게 됩니다.
try, 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 이 실행될 것이다. 에러의 내용을 보고 빨리 그 에러를 고치는 것이 올바른 방법이다.
즉, 에러 내용 기록용으로만 쓰는게 좋다는 말이 바로 이 말이다.
'노드' 카테고리의 다른 글
노드 fs로 HTML 읽어 제공하기 (0) 2023.04.13 노드 http 서버 만들기 (0) 2023.04.13 노드 스레드풀과 커스텀 이벤트 (0) 2023.04.12 노드 pipe와 스트림 메모리 효율 확인 (0) 2023.04.12 노드 버퍼와 스트림 이해하기 (1) 2023.04.12