JavaScript에서는 throw 문과 try...catch 블록을 조합하여 개발자가 직접 사용자 정의 예외(custom exception)를 만들고 처리할 수 있습니다. 기본 제공되는 오류 유형만으로는 부족할 때, 상황에 맞는 의미 있는 오류 메시지를 직접 던지면 코드의 가독성과 디버깅 효율이 크게 향상됩니다.
기본 예제: throw와 try...catch 활용하기
다음 예제는 0으로 나누는 상황을 감지하여 사용자 정의 예외를 발생시키고, 이를 catch 블록에서 처리하는 전체 HTML 코드입니다.
<html>
<head>
<script>
function myFunc() {
var a = 30;
var b = 0;
try {
if (b == 0) {
// 사용자 정의 예외 발생
throw "Divide by zero error.";
} else {
var c = a / b;
}
}
catch (e) {
alert("Error: " + e);
}
}
</script>
</head>
<body>
<p>아래 버튼을 클릭하면 결과를 확인할 수 있습니다:</p>
<form>
<input type="button" value="클릭" onclick="myFunc();" />
</form>
</body>
</html>
코드 동작 원리
- 조건 검사: 나누는 값
b가 0인지 확인합니다. - 예외 발생: 조건이 참이면
throw문으로 문자열 형태의 오류 메시지를 던집니다. - 예외 처리:
catch블록이 던져진 값을 받아 알림 창으로 사용자에게 오류를 안내합니다.
더 나은 방식: Error 객체 확장하기
문자열을 그대로 던지는 것보다 Error 객체를 상속한 사용자 정의 에러 클래스를 만드는 것이 좋습니다. 이렇게 하면 오류의 이름(name)과 스택 추적(stack trace) 정보를 함께 활용할 수 있어 디버깅이 훨씬 수월해집니다.
// 사용자 정의 에러 클래스 정의
class DivideByZeroError extends Error {
constructor(message) {
super(message);
this.name = "DivideByZeroError";
}
}
function divide(a, b) {
if (b === 0) {
throw new DivideByZeroError("0으로 나눌 수 없습니다.");
}
return a / b;
}
try {
console.log(divide(30, 0));
} catch (e) {
console.error(`${e.name}: ${e.message}`);
}
정리
간단한 상황에서는 문자열이나 일반 객체를 throw 하는 방식으로도 충분하지만, 실무에서는 Error 클래스를 확장한 사용자 정의 예외를 사용하는 것이 권장됩니다. 오류 유형을 명확히 구분할 수 있어 instanceof 연산자로 특정 예외만 골라 처리하는 등 더 정교한 예외 처리 로직을 구현할 수 있습니다.