프로그래밍/Javascript

자바스크립트 예외 처리 완전 정복: try-catch-finally부터 사용자 정의 예외, 오류 처리 패턴까지

shimdh 2025. 2. 13. 09:57
728x90

1. 자바스크립트 예외 처리, 왜 중요할까요?

우리가 웹 애플리케이션을 개발할 때, 예상치 못한 오류나 예외 상황은 언제든지 발생할 수 있습니다. 이러한 상황에 적절하게 대처하지 못하면 애플리케이션이 멈추거나 오작동하는 등 사용자 경험을 저해하는 결과를 초래할 수 있습니다.

자바스크립트의 예외 처리는 이러한 문제에 대비하기 위한 필수적인 프로그래밍 기법입니다. 예외 처리를 통해 오류를 감지하고, 적절한 방식으로 처리하여 애플리케이션의 안정성을 유지하고 사용자에게 원활한 서비스를 제공할 수 있습니다.

2. try, catch, finally 블록 파헤치기

자바스크립트에서 예외 처리는 try, catch, finally 블록을 통해 이루어집니다. 각 블록의 역할과 특징을 자세히 살펴보겠습니다.

2.1 try 블록: 예외 발생 가능성이 있는 코드를 담는 그릇

try 블록은 예외가 발생할 가능성이 있는 코드를 감싸는 역할을 합니다. 이 블록 안에서 예외가 발생하면 즉시 실행이 중단되고, 해당 예외를 처리할 수 있는 catch 블록으로 제어가 넘어갑니다.

2.2 catch 블록: 발생한 예외를 붙잡아 처리하는 해결사

catch 블록은 try 블록에서 발생한 예외를 처리하는 역할을 합니다. catch 블록은 예외 객체를 인자로 받아, 예외의 종류와 내용을 파악하고 적절한 대응 조치를 취할 수 있습니다. 오류 메시지를 사용자에게 표시하거나, 특정 로직을 재실행하거나, 오류 로그를 기록하는 등의 처리를 수행할 수 있습니다.

2.3 finally 블록: 예외 발생 여부와 관계없이 항상 실행되는 뒷정리 전문가

finally 블록은 예외 발생 여부와 관계없이 항상 실행되는 코드를 포함합니다. finally 블록은 주로 리소스 해제, 파일 닫기, 데이터베이스 연결 종료 등과 같이 프로그램의 실행 흐름과 관계없이 반드시 실행되어야 하는 작업을 수행하는 데 사용됩니다.

3. 실용적인 예제로 이해하는 예외 처리

function divide(a, b) {
    try {
        if (b === 0) {
            throw new Error("0으로 나눌 수 없습니다."); // 사용자 정의 예외 발생
        }
        return a / b;
    } catch (error) {
        console.error("오류 발생:", error.message); // 오류 메시지 출력
        // 추가적인 오류 처리 로직 (예: 사용자에게 알림)
        return NaN; // 또는 다른 적절한 반환 값
    } finally {
        console.log("divide 함수 실행 완료"); // 함수 실행 완료 메시지 출력
    }
}

console.log(divide(10, 2)); // 결과: 5
console.log(divide(10, 0)); // 결과: 오류 발생: 0으로 나눌 수 없습니다., NaN
console.log(divide(20, 5)); // 결과: 4

위 예제에서 divide 함수는 두 숫자를 나눕니다. 만약 분모가 0일 경우, throw 문을 사용하여 Error 객체를 생성하고 예외를 발생시킵니다. catch 블록은 발생한 예외를 포착하여 오류 메시지를 콘솔에 출력하고, NaN 값을 반환합니다. finally 블록은 예외 발생 여부와 관계없이 "divide 함수 실행 완료" 메시지를 출력합니다.

4. 사용자 정의 예외, 왜 사용해야 할까요?

자바스크립트에서는 내장된 에러 외에도 사용자 정의 에러 클래스를 만들어 사용할 수 있습니다. 사용자 정의 에러를 사용하면 특정 상황에 맞는 더 구체적인 에러 처리가 가능하며, 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.

class ValidationError extends Error {
    constructor(message, field) {
        super(message);
        this.name = "ValidationError"; // 오류 이름 설정
        this.field = field; // 오류가 발생한 필드 정보 추가
    }
}

function validateForm(formData) {
    if (formData.username.length < 3) {
        throw new ValidationError("유효하지 않은 사용자 이름입니다.", "username");
    }
    // 다른 유효성 검사 로직
}

try {
    validateForm({ username: "aa" });
} catch (error) {
    if (error instanceof ValidationError) {
        console.error(error.name + ": " + error.message + " (" + error.field + ")");
    } else {
        console.error("알 수 없는 오류 발생:", error);
    }
}

위 예제에서는 ValidationError라는 사용자 정의 에러 클래스를 만들어 폼 유효성 검사 시 발생하는 오류를 처리합니다. ValidationError는 오류 메시지와 함께 오류가 발생한 필드 정보를 포함하고 있어, 더 자세한 오류 정보를 제공할 수 있습니다.

5. 다양한 예외 처리 패턴 탐구

예외 처리는 단순히 try-catch-finally 블록을 사용하는 것 외에도 다양한 패턴과 기법을 활용하여 보다 효율적으로 오류를 관리할 수 있습니다.

5.1 전역 오류 핸들링: 모든 오류를 한 곳에서 관리하는 방법

window.onerror 이벤트 핸들러를 사용하면 자바스크립트 코드에서 발생하는 모든 오류를 전역적으로 처리할 수 있습니다. 전역 오류 핸들러는 오류 로깅, 사용자 알림, 오류 보고 등 다양한 용도로 활용될 수 있습니다.

window.onerror = function(message, source, lineno, colno, error) {
    console.error("전역 오류 발생:", message, source, lineno, colno, error);
    // 오류 로깅 또는 사용자 알림 처리
    return true; // 오류 전파 방지
};

5.2 오류 버블링: 오류를 스택을 따라 전파하는 방법

자바스크립트에서는 오류가 발생하면 호출 스택을 따라 상위 스코프로 전파되는 오류 버블링 현상이 발생합니다. 오류 버블링을 이용하면 오류를 한 곳에서 모아 처리하거나, 각 스코프에서 필요한 처리를 수행할 수 있습니다.

5.3 오류 경계 (Error Boundary): 컴포넌트 단위로 오류를 격리하는 방법

React와 같은 프레임워크에서는 오류 경계 컴포넌트를 사용하여 하위 컴포넌트에서 발생하는 오류를 격리하고 처리할 수 있습니다. 오류 경계를 사용하면 오류가 발생하더라도 애플리케이션 전체가 중단되는 것을 방지하고, 부분적으로 오류를 복구하거나 대체 UI를 표시할 수 있습니다.

결론: 자바스크립트 예외 처리, 안정적인 웹 애플리케이션 개발의 핵심

자바스크립트 예외 처리는 안정적이고 사용자 친화적인 웹 애플리케이션 개발에 필수적인 요소입니다. 효과적인 예외 처리 전략을 수립하고 다양한 패턴과 기법을 활용함으로써, 애플리케이션의 안정성을 극대화하고 사용자에게 끊김 없는 서비스를 제공할 수 있습니다.

728x90