JavaScript/에러처리/Lesson 18
에러 처리 — try/catch/finally + 커스텀 에러
45분·theory
에러 처리 — try/catch/finally + 커스텀 에러
🎯 이 lesson 을 읽고 나면
이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.
- ▸✅ try / catch / finally + Error.cause (ES2022)
- ▸✅ 커스텀 에러 클래스로 도메인 예외 분리
- ▸✅ async 함수의 에러 처리 + unhandledrejection
학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.
try / catch / finally — 기본 구조
가장 단순한 try-catch
에러가 던져지면 위 코드는 즉시 catch 블록으로 점프. 던지지 않으면 catch 는 건너뜀.
finally — 성공·실패 상관없이 실행
리소스 해제 (DB 커넥션·파일·락) 의 표준 패턴.
Error 객체의 4가지 정보
흔한 에러 타입 4종
- ▸TypeError —
null.foo,undefined()— 가장 자주 보는 에러 - ▸ReferenceError —
consle.log같은 없는 변수 참조 - ▸SyntaxError — 문법 자체가 깨짐 (보통 빌드 단계에서)
- ▸RangeError — 배열 길이 음수·재귀 무한 호출
AI 에게 에러 메시지를 그대로 보여주면 대부분 원인을 짚어줍니다 — 이게 "디버깅 토큰 절약" 의 핵심.
커스텀 에러 클래스 — 도메인별 분리
왜 커스텀 에러가 필요한가
모든 에러를 Error 하나로 던지면 — catch 에서 원인별 분기 가 어려움. 커스텀 클래스로 분리:
분기 처리
instanceof 로 타입 분기. 코드 의도가 명확해집니다.
ES2022 cause — 에러 체이닝
원인 에러를 보존 한 채 새 에러로 감쌈. 로그에 원본 stack 까지 남아 디버깅이 쉬워집니다.
async / await 에서 에러 처리 — 표준 3패턴
패턴 1 — try/catch in async
가장 자주 쓰는 형태. fetch 는 4xx/5xx 에서 reject 하지 않음 — res.ok 또는 res.status 를 직접 검사해야 합니다.
패턴 2 — Promise.catch()
async 함수가 아닌 곳 (이벤트 핸들러 등) 에서 사용. async/await 와 혼용도 가능.
패턴 3 — 상위로 그대로 던지기
도메인 로직 함수는 try-catch 안 함. 책임은 최상위 호출자 (컨트롤러·UI 컴포넌트) 에 위임.
흔한 함정 — forEach 에서 await
forEach 는 Promise 를 인식하지 않음. for...of 로 바꾸세요:
React Error Boundary — UI 에러 처리
렌더링 중 에러 를 잡아 전체 앱이 빠지지 않게 막아줌. try-catch 는 렌더링 에러를 못 잡습니다.
🤖 AI 에게 이렇게 요청해보세요
- ▸"이 fetch 코드에 res.ok 검사와 try-catch 를 추가해줘"
- ▸"이 에러를 NotFoundError·ValidationError 로 분기해서 처리해줘"
- ▸"forEach 의 await 가 동작 안 하는데 for...of 로 바꿔줘"
⚡ 직접 해보기 — try · catch · finally + 커스텀 에러
에러 종류별 분기 처리. instanceof 로 어떤 에러인지 판별.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
먼저 읽으면 좋은 개념: Async/Await