[JavaScript] 에러 처리

SungWoo·2024년 12월 4일

자바스크립트 공부

목록 보기
40/42
post-thumbnail

에러가 발생하지 않는 코드를 작성하는 것은 불가능하다. 사용자가 의도하지 않은 입력을 제공하거나, 서버와의 연결이 끊어지는 등의 다양한 상황에서 에러가 발생할 수 있다.

이를 제대로 처리하지 않으면 애플리케이션이 예기치 않게 종료되거나, 이상 동작을 할 수 있기 때문에 안정적이고 예측 가능한 애플리케이션을 만드는 데 있어 에러 처리는 중요하다.

에러 처리의 필요성

에러 처리는 프로그램 실행 중 발생할 수 있는 문제를 적절히 다루어 애플리케이션의 흐름을 제어하고, 사용자에게 유용한 메시지를 제공하는 역할을 한다.

// 네트워크 요청 실패를 처리하는 예시
function fetchData(url) {
  return fetch(url)
    .then(response => {
      if (!response.ok) {
        throw new Error('Network response was not ok');
      }
      return response.json();
    })
    .catch(error => {
      // 네트워크 요청 실패 시 사용자에게 알림
      alert('데이터를 불러오는 데 실패했습니다. 다시 시도해주세요.');

      // 에러 메시지 콘솔에 출력
      console.error('Error:', error.message);
    });
}

// 예시 URL
const apiUrl = 'https://api.example.com/data';

// 네트워크 요청
fetchData(apiUrl);

위 코드처럼 네트워크 요청 실패 시 사용자가 이에 대한 알림을 받도록 하여 시스템이 불안정해지지 않도록 제어할 수 있다.


try, catch, finally 문

try...catch...finally 문은 아래 코드와 같이 3개의 블록으로 구성된다.

try {
  // 예외가 발생할 수 있는 코드
  throw new Error("Something went wrong");
} catch (error) {
  // 예외 처리 코드
  console.error(error.message);
} finally {
  // 항상 실행되는 코드
  console.log("This will always run.");
}

try 블록 내에서 코드가 실행되고, 에러가 발생하면 catch 블록이 실행된다. finally 블록은 에러 발생과 상관없이 반드시 한 번 실행된다.

이처럼 try...catch...finally 문으로 에러를 처리하면 프로그램이 강제 종료되지 않는다.


Error 객체

Error 생성자 함수는 에러 객체를 생성한다.

Error 객체는 message 속성을 통해 에러 메세지를 전달하며, stack 속성을 통해 에러가 발생한 위치에 대한 정보도 제공한다. 그리고 사용자 정의 에러를 만들 때도 Error 객체를 확장하여 사용할 수 있다.

try {
  throw new Error("Custom error message");
} catch (error) {
  console.error(error.message); // "Custom error message"
  console.error(error.stack);   // 에러 발생 위치 정보
}
  • message : Error 생성자 함수에 인수로 전달한 에러 메시지
  • stack : 에러를 발생시킨 콜 스택의 호출 정보를 나타내는 문자열 (디버깅 목적으로 사용)

throw 문

Error 생성자 함수로 에러 객체를 생성한다고 에러가 발생하는 것이 아니고, 생성한 에러를 throw 문으로 던져줘야 한다.

function checkNumber(num) {
  if (num < 0) {
    throw new Error("Negative numbers are not allowed");
  }
  return num;
}

try {
  checkNumber(-1);
} catch (error) {
  console.error(error.message); // "Negative numbers are not allowed"
}

throw 문으로 에러를 던지면 catch 문의 에러 변수가 생성되고 던져진 에러 객체가 할당된다. 그리고 catch 블록이 실행되기 시작한다.


에러의 전파

에러는 호출자(caller) 방향으로 전파된다.

즉, 에러는 발생한 함수나 블록을 빠져나가면서 상위 호출 스택으로 전파되는데 이 과정에서 try...catch 문이 에러를 처리하지 않으면, 해당 에러는 호출한 함수나 전역 스코프까지 전파된다.

function foo() {
  throw new Error("Error in foo");
}

function bar() {
  foo(); // foo에서 발생한 에러는 bar로 전파된다
}

try {
  bar();
} catch (error) {
  console.error(error.message); // "Error in foo"
}

이처럼 throw 된 에러를 캐치하여 적절히 대응하면 프로그램을 강제 종료시키지 않고 코드의 실행 흐름을 복구할 수 있다. 만일 throw 된 에러를 어디에서도 처리하지 않으면 프로그램은 강제 종료된다.

profile
어제보다 더 나은

0개의 댓글