[Javascript] throw 살펴보기

Dev_sheep·2024년 10월 20일
1

throw문을 적용했을 때 이거를 단순하게 처음 접했을 때 인터럽트 마냥 생각해서 호출스택 등 고려하지 않은 적이 있다. 물론, throw문을 가끔이라 쓰고 거의 안쓰긴 하지만, 궁금한 점을 정리하기 때문에 throw에 대해서 작성해보고자 한다.

개념

throw문은 예외를 발생시켜 코드 실행을 중단해준다

여기서 중요한 점은 호출 스택을 거슬러 올라가서 가장 가까운 try-catch문으로 제어를 이동한다.

try {
    throw new Error("Something went wrong"); // 예외를 발생시킴
} catch (error) {
    console.log("Caught the error:", error.message); // 예외를 처리
}

throw 처리 및 미처리 상황 예시들

비동기 함수에서 발생한 경우

try {
    setTimeout(() => {
        throw new Error("Async error");
    }, 1000);
} catch (error) {
    console.log("This will not catch the error");
}
  • 콜백 함수 내에서 발생한 throw는 콜백 함수가 비동기적으로 호출되기 때문에 호출 스택이 달라 발생되지 않는다.
  • console에는 나오지만, 외부의 try-catch에서 잡지 않기에 원하는 코드 방식대로 되지 않을 수 있다.

해결 방법

setTimeout(() => {
    try {
        throw new Error("Async error");
    } catch (error) {
        console.log("Caught inside setTimeout:", error.message);
    }
}, 1000);

사진에서처럼 아래의 경우처럼 해결이 된다.

그럼 에러 처리에 더 용이하게 된다.

프로미스 내부에서 throw

const promise = new Promise((resolve, reject) => {
    throw new Error("Promise error");
});

promise.catch((error) => {
    console.log("Caught promise error:", error.message);
});

catch 메서드로만 처리할 수 있다

이외에도 finally 메서드로 처리하는 경우도 존재한다

예외 던지기

function process() {
    try {
        throw new Error("Initial error");
    } catch (error) {
        console.log("Caught:", error.message);
        throw error; // 예외를 다시 던짐
    }
}

try {
    process();
} catch (error) {
    console.log("Caught again in outer block:", error.message);
}

경우에 따라 필요한 경우 연쇄해서 에러 처리도 가능하다

결과

결과적으로는 throw문을 사용할 때 호출 스택, 스코프 등을 고려해서 외부 try-catch 함수에서 코드의 처리가 되도록 설정을 하는 것이 중요해보인다.

에러가 발생할 수 있음에도 처리하지 않고 진행하면 프로그램이 강제 종료되니까요

profile
기록과 공유

0개의 댓글