9. 해결 방법 및 한계
Q. 해결 방법?
→ try-catch 블록을 콜백 안에서 사용하도록 변경
example.js
setTimeout(() => {
try {
throw new Error("에러 발생!");
} catch (e) {
console.error("콜백 내부에서 잡음:", e.message);
}
}, 0);실행 결과
콜백 내부에서 잡음: 에러 발생!
위 해당 방식의 단점
위 example.js 예시처럼 구조가 복잡하지 않은 단일 콜백에서는 크게 문제 없음
하지만 콜백이 중첩되거나 연결되는 경우에는, 에러 처리 구조가 흩어지게 되어 관리가 복잡해짐
이 구조에서 콜백마다 try-catch를 쓰면 코드가 훨씬 더 복잡해지고, 가독성이 저하됨
또한 바깥 catch는 안쪽(Line 13)에서 발생한 예외를 받지 못함
✔ 안쪽에서 발생한 예외를 받아야 하는 경우
해당 기능 전체에 대해 어디서 에러가 발생하든 한 곳에서 공통적으로 처리하거나,
처리 완료 로직이나 재시도 로직 등을 한 번만 수행하고 싶을 때
complicated.js
// 1단계 비동기 처리
setTimeout(() => {
try {
console.log('1단계 진입');
// 2단계 비동기 처리 (1단계 안쪽)
setTimeout(() => {
try {
console.log('2단계 진입');
// 여기서 예외 발생
throw new Error('2단계에서 에러 발생!');
} catch (e) {
console.error('안쪽(2단계) 콜백에서 에러가 잡힘:', e.message);
}
}, 0);
} catch (e) {
// 이 catch는 2단계에서 throw된 에러를 못 잡음
console.log('바깥(1단계) 콜백에서 잡힘:', e.message);
}
}, 0);Callback에 try-catch를 사용했을 때의 단점 요약
-
콜백 내부에 try-catch를 넣으면 해당 콜백 내의 에러는 잡을 수 있음
-
단일 콜백 구조 내에서는 큰 문제가 없을 수 있음
-
2개 이상의 콜백이 중첩되어 작성되는 경우, 각 콜백마다 개별적인 에러 핸들링이 필요
-
중첩된 콜백에서는 에러가 분산되고, 코드 흐름이 중첩되어 가독성, 디버깅이 어려워짐
→ 단순히 try-catch로 못 잡는다는 문제 하나만 있는 것이 아닌 것
Last updated on