Node.JS

[Node.js 교과서] 2-x. 예외 처리하기

옴악핫세 2023. 12. 26. 18:54

프로그래밍의 오류 종류

프로그램에서 오류가 발생하면 시스템 레벨에서 프로그램에 문제를 야기하여 원치 않는 버그를 일으키거나, 심각하면 실행중인 프로그램을 강제로 종료시키기도 함

 

원인은 다양한데, 내부적인 요인과 외부적인 요인으로 나눌 수 있음

- 내부적인 요인 : 프로그램 설계 로직의 결함 등...

- 외부적인 요인 : 하드웨어에 대한 문제 등...

 

프로그래밍에서는 이러한 오류를 발생 시점에 따라 크게 3가지로 나눔

(1) 컴파일 에러 : 컴파일시에 발생하는 에러 (Ex: 문법 구문 오류 Syntax Error)

(2) 런타임 에러 : 실행시에 발생하는 에러 ()

(3) 논리적 에러 : 실행은 되지만 의도와 다르게 동작 (≒논리 에러 Logic Error)

 

 

 

프로그램 실행 시, 발생하는 오류를 크게 2가지로 구분할 수 있음

바로 Error와 Exception

Error (에러)

프로그램 코드에 의해서 수습될 수 없는 심각한 오류

Error는 메모리 부족, 스택오버플로우와 같이 일단 발생하면 복구할 수 없는 심각한 오류

 

Exception (예외)

프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

즉 처리하지 못한  에러

알고리즘 오류로 예외가 계속 발생한다고 해도 Error 처럼 프로그램이 죽거나 그럴 경우는 적음

대부분 예외는 개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생

예러는 노드 스레드를 멈추게하는데, 싱글 스레드인 노드에서 스레드가 멈추는 것은 프로세스가 멈추는 것!

그러므로 에러 처리는 꼼꼼하게 수행해야함

 

function a() {
    throw new Error('서버를 고장내자')
}

console.log("에러 발생 전")

a();

console.log("에러 발생 후")

에러 발생 후는 출력되지 않음

그전에 에러가 발생하여 스레드가 멈춰서 코드 실행이 멈춤

 

but 아래와 같이 예외 처리를 하면 

function a() {
    try {
        throw new Error('서버 고장남!')
    } catch (error) {
        console.error(error)
    }
}

console.log("에러 발생 전")

a();

console.log("에러 발생 후")

에러 발생 이후의 코드들이 정상적으로 실행됨

 

 

Error의 상황을 미리 미연에 방지하기 위해서 Exception 상황을 만들 수 있으며, try-catch문으로 Exception handling을 할 수 있습니다.

 

그러면 에러 발생이 의심되는 모든 구문에다가 try-catch를 쓰는것이 좋을까요?

No! 그러면 가독성이 너무 안좋아 질 수 있음

 

예기치 못한 에러 처리는 아래와 같이 process.on() 메소드 를 이용할 수 있음

 

아래 코드를 보면 에러가 발생해서 시작은 출력되지 않음

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

 

그렇다면 아래처럼 모든 곳에 try catch 처리를 할 수 는 없음


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

 

이때 process.on() 메소드를 사용할 수 있음!

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


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

 

 

이렇게 하면 예상치 못한 에러가 발생해도 process.on() 메소드로 에러 처리가 되어

에러 발생 이후 코드가 실행되어 시작 이 출력됨

 

하지만  process.on() 은 만능 해결책이 아님!

 process.on()에서 에러처리 상황이 발생했다는것 자체가 현재 내 코드에는 결함이 있다는것이기 때문에

 process.on()는 서버가 다운되는 것을 방지하고 에러를 기록하는 용도로만 사용해야함

그리고 신속하게 에러를 파악해서 해결해야함