오류 처리
AI
qwen-3-235b-a22b
오류 처리
JavaScript는 동적 언어의 특성상 런타임 오류가 발생할 가능성이 높으며, 효과적인 오류 처리는 안정적인 애플리케이션 개발에 필수적입니다. 이 문서는 JavaScript에서의 오류 처리 기법, 내장 오류 유형, 디버깅 방법론, 모범 사례를 체계적으로 정리합니다.
1. JavaScript의 주요 오류 유형
JavaScript 엔진은 다양한 표준 오류 타입을 제공합니다. 각 오류는 Error
객체를 상속받으며, 오류 원인을 구체적으로 식별할 수 있습니다.
오류 유형 | 설명 | 발생 시나리오 예시 |
---|---|---|
SyntaxError | 코드 구문 오류 | let x = 5 +; |
TypeError | 잘못된 데이터 타입 사용 | null.toUpperCase() |
ReferenceError | 정의되지 않은 변수 참조 | console.log(undeclaredVariable) |
RangeError | 범위를 벗어난 값 사용 | new Array(-1) |
URIError | URI 관련 함수 사용 오류 | decodeURIComponent("%") |
EvalError | eval() 함수 관련 오류 (현대 브라우저에서는 사용되지 않음) |
eval("return 1") 내부 사용 |
AggregateError | 여러 오류를 포함하는 컨테이너 | Promise.any() 실패 시 |
2. 오류 처리 메커니즘
2.1 try...catch...finally 구문
try {
// 오류 발생 가능 코드
const result = riskyOperation();
console.log("결과:", result);
} catch (error) {
// 오류 처리
console.error("오류 발생:", error.message);
} finally {
// 항상 실행되는 정리 코드
console.log("작업 종료");
}
- try: 오류 검출 대상 코드 블록
- catch: 발생한 오류를 받아 처리
- finally: 성공/실패 여부와 무관하게 실행
⚠️ 주의사항:
catch
블록에서 구체적인 오류 타입을 체크하는 것이 안전합니다.
> if (error instanceof TypeError) { > // 타입 에러 특화 처리 > } >
2.2 throw 문을 통한 오류 발생
function validateAge(age) {
if (typeof age !== "number") {
throw new TypeError("나이는 숫자여야 합니다.");
}
if (age < 0) {
throw new RangeError("나이는 음수일 수 없습니다.");
}
return age;
}
- 사용자 정의 오류 객체 생성 가능
Error
,SyntaxError
등 내장 클래스 활용 권장
2.3 비동기 처리 오류
async function fetchData() {
try {
const response = await fetch("https://api.example.com/data");
if (!response.ok) throw new Error("네트워크 오류");
return response.json();
} catch (error) {
console.error("비동기 오류:", error.message);
throw error; // 상위 호출자에게 전달
}
}
[async/await](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/JavaScript/async%2Fawait)
문법의 경우try...catch
로 동기식 처리Promise.prototype.catch()
를 통한 체이닝도 가능
3. 디버깅 및 오류 해결
3.1 오류 정보 활용
try {
// 오류 발생 코드
} catch (error) {
console.error("오류 메시지:", error.message);
console.error("오류 스택:", error.stack); // 비표준이지만 유용
}
error.message
: 간단한 설명error.stack
: 호출 스택 추적 (브라우저/Node.js 환경별 차이 존재)
3.2 디버깅 도구
- 브라우저 개발자 도구: 소스 코드 중단점 설정
- Node.js 디버거:
node --inspect
옵션 사용 - 로그 라이브러리:
[winston](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%A1%9C%EA%B7%B8%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/winston)
,[pino](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%A1%9C%EA%B7%B8%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/pino)
등 구조화된 로깅
4. 모범 사례 및 팁
항목 | 설명 |
---|---|
1. 명확한 오류 메시지 | "Uncaught Error" 대신 "사용자 ID가 유효하지 않음"과 같은 구체적 메시지 사용 |
2. 예외의 과도한 사용 금지 | 일반적인 조건 처리에 try...catch 사용 지양 |
3. 오류 타입 구체화 | catch (error) 대신 catch (error instanceof TypeError) 사용 |
4. finally의 중요성 | 리소스 해제(파일 닫기, 네트워크 연결 종료 등) 반드시 처리 |
5. 글로벌 오류 처리 | [window.onerror](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/JavaScript/window.onerror) 또는 process.on('uncaughtException') 로 치명적 오류 모니터링 |
💡 성능 최적화: 오류 처리 코드가 성능에 영향을 주지 않도록 최소화합니다.
5. 관련 문서 및 참고 자료
이 문서는 JavaScript 개발자들이 안정적인 코드를 작성하고 예측 가능한 오류를 관리하는 데 도움을 주고자 합니다. 오류 처리는 단순한 예외 회피가 아닌, 시스템의 견고성을 강화하는 핵심 요소입니다.
AI 생성 콘텐츠 안내
이 문서는 AI 모델(qwen-3-235b-a22b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.