JavaScript

JavaScript 예외처리

bergerac 2025. 4. 10. 09:11

에러란? 부정확하거나 유효하지 않은 동작을 의미한다.

자바스크립트에서는 구문오류(SyntaxError)외의 대부분의 오류를 예외(Runtime Exception)라고 분류합니다.

 

🧨 예외의 종류

1. 구문 오류(Syntax Error)

  • 프로그램 실행 전에 발생
  • 문법이 언어의 정의된 규칙을 따르지 않을 때 발생
// 예: 괄호 닫기 생략
// console.log('프로그램이 시작되었습니다.'

위와 같이 정의된 규칙을 따르지 않으면 실행이 되지 않으며 개발도중 IDE가 감지해주는 경우가 대부분임

 

2. 런타임오류(Runtime Error)

 

  • 프로그램 실행 중에 발생
  • 예측 가능한 비정상적인 조건이나 예외적인 사건
  • 코드 실행 도중 오류가 발생하면 실행이 중단됨

 

// console.rog('log를 rog로 잘못 입력하였습니다.');

🧨 예외 처리 방법

1. 조건문을 이용한 기본 예외 처리 (권장 X)

예외가 발생하지 않도록 조건문으로 방지하는 방식입니다. 코드가 길어지고 가독성이 떨어지므로 복잡한 로직에서는 비효율적입니다.

document.addEventListener('DOMContentLoaded', () => {
  const h1 = document.querySelector('h1');

  if (h1) {
    h1.textContent = '안녕하세요';
  } else {
    console.log('h1 태그가 존재하지 않습니다.');
  }

  console.log('다음 로직');
});

 

2. try-catch-finally를 이용한 예외 처리

예외 발생 가능성이 있는 코드를 try 블록에 작성하고, 예외 발생 시 catch 블록에서 처리합니다. finally는 예외 여부와 관계없이 항상 실행됩니다.(권장)

function randomException() {
  if (Math.random() < 0.5) {
    throw new Error('무언가 잘못되었습니다!');
  }

  return '성공적으로 실행되었습니다.';
}

try {
  const result = randomException();
  console.log(result);
} catch(e) {
  console.log('catch 구문');
  console.log(e.message);
} finally {
  console.log('언제나 실행');
}

 

🧨 Error 객체와 사용자 정의 예외

자바스크립트의 모든 예외는 Error 객체를 기반으로 만들어진다.

주요 속성

 

  • name: 예외 이름
  • message: 예외 메시지
let myError = new Error('에러를 생성합니다.');
console.log(myError.message);

 

예외 강제 발생 : throw

예외를 명시적으로 발생시키고 싶을 때 throw 키워드를 사용한다.

throw new Error('이건 명시적인 에러입니다.');
// throw '단순 문자열도 가능';
// throw 404; // 숫자도 가능

 

🧨 매개변수 검증

function text(object) {
  if (!object || object.a === undefined || object.b === undefined) {
    throw new Error('함수 호출 시 object와 a, b속성이 전달 되어야합니다!');
  }

  console.log(object.a + object.b);
}

try {
  text({a: 5, b: 10});
  text({a: 'cyrano', b: 'bergerac'});
  text(); // 에러 발생
} catch(e) {
  console.error('에러 발생: ', e.message);
}

유효성 검사를 통해 예외를 사전에 방지하고 적절한 메시지로 원인을 쉽게 파악할 수 있도록 할 수 있다.

 

✅ 마무리 정리

  • 구문 오류는 개발 중 IDE가 잡아주고, 대부분 실행 전에 확인 가능
  • 런타임 예외는 try-catch로 처리해야 안정적인 서비스 제공 가능
  • throw를 통해 사용자 정의 예외를 만들어 유연하게 오류 처리 가능
  • finally는 자원 정리나 로그 기록 등 필수 후처리에 유용