프로그래밍/Typescript

TypeScript에서의 오류 처리와 예외 처리의 중요성

shimdh 2025. 4. 5. 09:36
728x90

소프트웨어 개발에서 오류 처리는 필수적인 요소입니다. 특히 TypeScript와 같은 언어에서는 오류를 효과적으로 관리하는 방법이 중요합니다. 이번 포스트에서는 TypeScript에서의 오류 처리, 특히 예외 처리에 대해 깊이 있게 살펴보겠습니다.

1. 오류의 종류

오류는 크게 세 가지 유형으로 나눌 수 있습니다:

1.1 구문 오류 (Syntax Errors)

  • 문법 규칙을 위반했을 때 발생합니다.
  • 코드가 컴파일되지 않거나 실행되지 않게 만듭니다.
  • 예: 세미콜론을 빼먹거나 괄호를 잘못 사용하는 경우.

1.2 논리 오류 (Logical Errors)

  • 코드가 문법적으로 올바르지만, 예상한 대로 작동하지 않을 때 발생합니다.
  • 예: 잘못된 수학적 계산이나 조건문이 잘못 설정된 경우.

1.3 런타임 오류 (Runtime Errors)

  • 프로그램이 실행 중에 발생하는 에러로, 예외가 던져질 수 있습니다.
  • 주로 잘못된 데이터 타입이나 배열의 인덱스 초과와 같은 상황에서 발생합니다.

2. try-catch 구문

TypeScript에서 예외 처리를 수행하기 위해 가장 일반적으로 사용하는 방법은 try-catch 블록입니다. 이 구조는 코드의 특정 부분에서 발생할 수 있는 예외를 포착하고, 이를 처리하는 데 유용합니다.

function divide(a: number, b: number): number {
    try {
        if (b === 0) {
            throw new Error("0으로 나눌 수 없습니다."); // 사용자 정의 예외 던지기
        }
        return a / b;
    } catch (error) {
        console.error(error.message); // 에러 메시지를 콘솔에 출력
        return NaN; // 실패 시 NaN 반환
    }
}

console.log(divide(10, 2)); // 5
console.log(divide(10, 0)); // "0으로 나눌 수 없습니다."

위의 코드는 두 숫자를 나누는 함수로, 만약 분모가 0일 경우에는 Error 객체를 생성하여 사용자에게 적절한 메시지를 제공하고 있습니다. 이를 통해 개발자는 예외 상황을 미리 예측하고, 사용자에게 명확한 피드백을 줄 수 있습니다.

3. finally 블록

finally 블록은 try-catch 구조에서 항상 실행되는 부분으로, 리소스를 정리하거나 마지막 작업을 수행할 때 유용합니다. 이 블록은 예외가 발생하더라도 항상 실행되므로, 중요한 후처리를 보장합니다.

function readFile(filePath: string): string | null {
    let fileContent = '';

    try {
        // 파일 읽기 로직 (실제로는 fs 모듈 등을 사용할 것)
        if (!filePath) throw new Error("파일 경로가 필요합니다.");

        fileContent = "파일 내용"; // 여기서 실제 파일 내용을 읽어야 함

    } catch (error) {
        console.error(error.message);
        return null; 
    } finally {
        console.log("파일 읽기 시도 완료"); 
    }

    return fileContent;
}

여기서는 파일을 읽으려는 시도를 하고 있으며, 성공 여부와 관계없이 항상 "파일 읽기 시도 완료"라는 메시지가 출력됩니다. 이는 개발자가 파일 읽기 작업이 완료되었음을 확인할 수 있게 해줍니다.

4. 사용자 정의 예외 클래스 만들기

TypeScript에서는 특정 상황에 대한 보다 명확한 에러 관리를 위해 사용자 정의 예외 클래스를 만들 수도 있습니다. 이를 통해 개발자는 보다 구체적이고 이해하기 쉬운 에러 핸들링을 구현할 수 있습니다.

class CustomError extends Error {
    constructor(message: string) {
        super(message);
        this.name = 'CustomError';
    }
}

function checkAge(age: number): void {
    if (age < 18) {
       throw new CustomError("성인이 아닙니다.");
   }
}

try {
   checkAge(15);
} catch (error) { 
   if (error instanceof CustomError) { 
      console.error(`사용자 정의 에러 발생: ${error.message}`);
   } else { 
      console.error(`알 수 없는 에러 발생`);
   }
}

위 코드에서는 사용자가 정의한 CustomError 클래스를 통해 연령 검증 기능을 구현했습니다. 이 방식은 더 구체적이고 이해하기 쉬운 에러 핸들링이 가능하게 하여, 개발자가 문제를 보다 쉽게 진단하고 해결할 수 있도록 돕습니다.

요약

오류 및 예외 처리는 안정적인 소프트웨어 개발의 핵심 요소입니다. TypeScript에서는 다양한 도구와 기법들을 통해 이를 쉽게 구현할 수 있도록 지원합니다. 개발자는 try-catch 구문을 사용하여 런타임 중의 문제를 포착하고, finally 블록을 통해 항상 필요한 후처리를 보장하며, 사용자 정의 클래스를 통해 더욱 세부적인 제어가 가능합니다. 이러한 방법들을 통해 개발자는 애플리케이션의 신뢰성을 높이고 유지보수를 용이하게 할 수 있습니다.

728x90