throw문을 적용했을 때 이거를 단순하게 처음 접했을 때 인터럽트 마냥 생각해서 호출스택 등 고려하지 않은 적이 있다. 물론, throw문을 가끔이라 쓰고 거의 안쓰긴 하지만, 궁금한 점을 정리하기 때문에 throw에 대해서 작성해보고자 한다.
throw문은 예외
를 발생시켜 코드 실행을 중단해준다
여기서 중요한 점은 호출 스택
을 거슬러 올라가서 가장 가까운
try-catch문으로 제어를 이동한다.
try {
throw new Error("Something went wrong"); // 예외를 발생시킴
} catch (error) {
console.log("Caught the error:", error.message); // 예외를 처리
}
try {
setTimeout(() => {
throw new Error("Async error");
}, 1000);
} catch (error) {
console.log("This will not catch the error");
}
비동기적
으로 호출되기 때문에 호출 스택이 달라 발생되지 않는다.try-catch
에서 잡지 않기에 원하는 코드 방식대로 되지 않을 수 있다.setTimeout(() => {
try {
throw new Error("Async error");
} catch (error) {
console.log("Caught inside setTimeout:", error.message);
}
}, 1000);
사진에서처럼 아래의 경우처럼 해결이 된다.
그럼 에러 처리에 더 용이하게 된다.
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 함수에서 코드의 처리가 되도록 설정을 하는 것이 중요해보인다.
에러가 발생할 수 있음에도 처리하지 않고 진행하면 프로그램이 강제 종료되니까요