TypeScript 오류 처리 초보자 가이드

효과적인 오류 처리가 모든 프로그래밍 언어에서 중요하며 TypeScript도 예외는 아닙니다. 적절한 오류 처리가 예상치 못한 조건을 우아하게 관리하여 견고하고 신뢰할 수 있는 애플리케이션을 만드는 데 도움이 됩니다. 이 가이드에서는 TypeScript에서 오류 처리의 기본 사항을 다루고 초보자를 위한 실제 예를 제공합니다.

TypeScript의 오류 이해

TypeScript의 오류는 JavaScript와 마찬가지로 런타임 또는 컴파일 타임에 발생합니다. TypeScript는 컴파일 타임에 많은 잠재적 문제를 포착할 수 있는 유형 안전성을 제공하지만, 런타임 오류는 여전히 적절하게 관리해야 합니다.

trycatch를 사용한 기본 오류 처리

TypeScript에서는 trycatch 블록을 사용하여 런타임 오류를 처리합니다. 이 접근 방식을 사용하면 오류를 발생시킬 수 있는 코드를 실행하고 오류가 발생하면 해당 오류를 처리할 수 있습니다.

trycatch의 예

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new Error("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    console.error(error.message);
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Cannot divide by zero

이 예에서 divide 함수는 두 숫자를 나누려고 시도합니다. 나누는 수가 0이면 오류가 발생하고 catch 블록에서 catch하여 오류 메시지를 기록합니다.

사용자 정의 오류 유형

TypeScript를 사용하면 사용자 정의 오류 유형을 정의하여 특정 오류 조건을 더 잘 표현할 수 있습니다. 사용자 정의 오류 유형은 오류를 분류하고 보다 효과적으로 처리하는 데 도움이 됩니다.

사용자 정의 오류 유형 만들기

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

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new DivisionError("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    if (error instanceof DivisionError) {
      console.error(`Custom Error: ${error.message}`);
    } else {
      console.error("An unexpected error occurred");
    }
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Custom Error: Cannot divide by zero

여기서 우리는 내장된 Error 클래스를 확장하는 사용자 정의 오류 클래스 DivisionError를 정의합니다. 우리는 divide 함수에서 이 사용자 정의 오류를 사용하여 더 구체적인 오류 처리를 제공합니다.

instanceof를 사용한 유형 보호

instanceof와 같은 유형 가드는 catch 블록에서 오류 객체의 유형을 좁히는 데 도움이 되므로 다양한 오류 유형을 다르게 처리할 수 있습니다.

유형 보호의 예

function processInput(input: string | number) {
  try {
    if (typeof input === "string") {
      console.log(input.toUpperCase());
    } else {
      throw new Error("Input must be a string");
    }
  } catch (error) {
    if (error instanceof Error) {
      console.error(`Error: ${error.message}`);
    } else {
      console.error("An unknown error occurred");
    }
  }
}

processInput("hello"); // Output: HELLO
processInput(42); // Output: Error: Input must be a string

이 예제는 catch 블록에서 유형을 보호하여 오류 객체가 Error의 인스턴스가 되도록 보장하고 정확한 오류 처리를 가능하게 하는 방법을 보여줍니다.

정리를 위해 finally 사용

finally 블록은 오류가 발생했는지 여부와 관계없이 실행해야 하는 코드를 실행하는 데 사용할 수 있습니다. 이는 파일을 닫거나 리소스를 해제하는 것과 같은 정리 작업에 유용합니다.

finally를 사용한 예

function readFile(filePath: string): string {
  try {
    // Simulate reading a file
    if (filePath === "") {
      throw new Error("File path cannot be empty");
    }
    return "File content";
  } catch (error) {
    console.error(`Error: ${error.message}`);
    return "";
  } finally {
    console.log("Cleanup: Closing file");
  }
}

console.log(readFile("path/to/file")); // Output: File content
console.log(readFile("")); // Output: Error: File path cannot be empty
                            //         Cleanup: Closing file

이 예에서 finally 블록은 오류가 발생했는지 여부에 관계없이 정리 메시지가 기록되도록 합니다.

결론

효과적인 오류 처리가 신뢰할 수 있는 TypeScript 애플리케이션을 구축하는 데 필수적입니다. trycatch, 사용자 정의 오류 유형, 유형 보호 및 finally를 사용하면 오류를 보다 효과적으로 관리하고 예상치 못한 상황에서도 애플리케이션이 예측 가능하게 동작하도록 할 수 있습니다.

이러한 기술을 사용하면 오류를 우아하게 처리하고 TypeScript 코드의 견고성을 개선할 수 있습니다. 이러한 개념을 연습하여 TypeScript 오류 처리에 능숙해지고 더 탄력적인 애플리케이션을 작성하세요.