본문 바로가기
Programming

Node.js Error Handling Object 에러 처리하기

by 개발자 염상진 2022. 9. 3.

 

코드를 작성하다보면 100% 에러를 만나게 됩니다. 누군가에게는 불편한 메시지일 수 있지만 개발자 입장에서는 반가운 존재입니다. 코드가 엄격하게 짜질 수록 예외처리를 쉽게 할 수 있고 어떤 부분이 잘못되었는지 친절하게 알려주는 구세주같은 존재이기 때문입니다.

 

 

특히 Node.js 환경에서는 1개의 스레드로 작동하는 환경이므로 메인 스레드를 잘 보호하면서 개발을 진행해야 합니다. 메인 스레드가 에러로 인해 멈춰버리면 그 프로그램은 더 이상 사용할 수 없습니다. 

 

throw error

 

throw 문을 사용해서 에러가 발생하면 터미널에 띄워줍니다.

try {
  throw new Error("error 발생");
} catch (error) {
  throw error;
}

정상적으로 에러가 발생합니다.

Error: error 발생
    at Object.<anonymous> (/home/at/project/test-project/04_Asymmetric_Key/error.js:2:11)
    at Module._compile (node:internal/modules/cjs/loader:1105:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
    at node:internal/main/run_main_module:17:47

 

파일을 처리하는 fs 모듈에서도 err를 던져주면 예외처리를 해줄 수 있습니다.

존재하지 않는 파일을 삭제하는 fs.unlink()를 사용했습니다. 

fs.unlink('./존재하지않는파일.js', (err, data)=>{
    if(err){
        throw err;
    }
    console.log(data);
})

 

 

정상적으로 에러가 발생합니다. 하지만 이 경우 프로세스가 멈춰버립니다. Node.js는 단 하나의 스레드만 돌아가므로 메인 스레드가 죽으면 끝입니다.

[Error: ENOENT: no such file or directory, unlink './존재하지않는파일.js'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'unlink',
  path: './존재하지않는파일.js'
}

 

Try ~ Catch 에러 핸들링

 

메인 스레드를 정지하지 않고 에러 처리를 하기 위해서는 try~catch 문으로 감싸줘야 합니다. 

프로세스를 계속 진행하기 위해 setInterval을 사용했습니다. 1초 간격으로 에러가 계속 throw 되는데, 이를 try~catch 문으로 잡으면 1초당 한번씩 에러가 계속 출력됩니다. 즉, 메인 스레드가 죽지 않습니다. 

setInterval(() => {
  fs.unlink("./존재하지않는파일.js", (err, data) => {
    try {
      if (err) {
        throw err;
      }
      console.log(data);
    } catch (error) {
      console.error(error);
    }
  });
}, 1000);

 

Promise 예외처리

 

Promise를 사용한는 경우에는 then()~catch()로 예외처리를 해줄 수 있습니다. catch() 문으로 에러를 핸들링해주면 메인 스레드가 죽지 않고 계속 실행됩니다. 

const fs = require("fs").promises;

setInterval(()=>{
    fs.unlink('./존재하지않는파일.txt')
        // 예외처리
        .catch(err=>console.error(err));
}, 1000)

 

uncaughtException 정말 알 수 없는 에러 핸들링

 

Node.js 환경에서 모든 에러를 처리해주는 에러코드가 uncaughtException 입니다. process 객체에 uncaughtException 이벤트를 작성해주면 모든 에러에 대해 예외처리가 가능해집니다.

예제를 보면 분명 throw new Error()를 발생시키지만 2초 후 '정상 실행됩니다' 문구가 출력됩니다. 이 이유는 process 객체에서 에러 핸들링을 해주고 있기 때문입니다. 

 

 

const fs = require("fs").promises;

process.on('uncaughtException', (err)=>{
    console.error('이건 정말 알 수 없는 에러입니다.', err);
})


setTimeout(()=>{
    console.log('정상 실행됩니다.');
}, 2000);

throw new Error('에러발생 에러발생');

 

하지만 모든 에러에 대해 uncaughtException 이벤트를 사용하면 안됩니다. Node.js 공식문서에서도 uncaughtException 이후 전달되는 콜백함수의 실행을 보증하지 않는다고 명시되어 있기 때문입니다. 정말 정말 최후의 예외처리에 사용하는 것이 좋습니다. 실무에서는 uncaughtException로 에러 코드만 로그로 남기고 process.exit()으로 프로그램을 종료하는것이 안전합니다. 

 

Node.js 에러 종류

 

에러코드를 다 외울 필요는 없습니다. 발생할 때 마다 Node.js 공식 문서를 살펴보거나 구글링을 해서 솔루션을 찾으면 됩니다.

 

에러코드 내용
node : command not found 노드가 환경변수에 추가되지 않은 경우 터미널에서 인식하지 못하는 상황입니다.
ReferenceError : 모듈 is not defined 모듈이 import되지 않아 발생하는 에러입니다.
Error : Cannot find module 모듈명 모듈이 정상적으로 설치되지 않았습니다.
FATAL : Can't set headers after they are sent 클라이언트의 요청에 대해 2번 이상의 응답을 보낸 경우입니다. 
FATAL ERROR : CALL_AND_RETRY_LAST Allocation failed - JavasScript heap out of memory 코드를 실행하는 도중 메모리가 부족해 프로그램이 정상 작동하지 않는 경우입니다. 만약 코드가 정상이라면 해당 프로그램의 메모리를 강제로 늘릴 수 있습니다.

$ node --max-old-space-size=4096 파일명
UnhandledPromiseRejectionWarning : Unhandled promise rejection  Promise를 구현할 때 catch() 문을 제대로 작성하지 않아 예외처리가 안된 경우 입니다. 
EADDRINUSE : 포트번호 프로그램에서 사용하는 포트가 이미 사용중입니다. 기존 포트를 종료하고 다시 실행하세요

$ sudo kill $(sudo lsof -t -i:포트번호)
EACCES || EPERM 프로그램이 작동할 때 충분한 권한이 없는 경우입니다.
EJSONPARSE JSON 파일 문법에 문제가 있는 경우입니다.
ECONNREFUSED 요청을 했지만 통신이 제대로 확립되지 않은 경우입니다. 서버의 주소가 맞는지, 꺼져있지는 않은지 확인합니다.
ETARGET package.json의 모듈 버전이 없는 경우입니다. 다시 설치하거나 버전을 확인하세요
ETIMEOUT 요청을 보냈지만 일정 시간내에 응답이 오지 않는 경우입니다. 요청을 받는 서버를 확인해야 합니다.
ENOENT : No such file or directory 파일/폴더에 접근하려고 시도했지만 존재하지 않는 경우입니다. 

 

 

 

 

 

 

 

 

 

Node.js readFile vs readFileSync promise file system module 사용법

Node.js 환경에서 파일을 읽고 쓰기 위한 모듈이 File System(fs) 모듈입니다. 파일을 읽고, 쓸수도 있고 폴더를 생성할 수도 있습니다. Node.js는 1개의 스택을 가진 프로그래밍 언어로 비동기 방식을 사

about-tech.tistory.com

 

 

Node.js crypto 비대칭키 대칭키 구현하기

암호화는 프로그램에서 굉장히 중요한 분야고 계속해서 연구가 진행되고 있습니다. 많은 연구자들이 좀더 안전한 암호화 알고리즘을 개발하고 있고, 현재 우리는 알게 모르게 그들의 결과물을

about-tech.tistory.com

 

 

[Solved] Error: truffle-plugin-verify listed as a plugin, but not found in global or local node modules!

Ropsten 네트워크에 작성한 스마트 컨트랙트를 배포하고, Verify 하는 과정에서 에러가 발생했습니다. Error: truffle-plugin-verify listed as a plugin, but not found in global or local node m..

about-tech.tistory.com

 

댓글