[typescript] 타입스크립트에서 예외 처리를 잘하는 방법은 무엇인가요?

1. 타입 안전한 예외 처리

타입스크립트에서는 에러를 던지고, 처리하는 방법으로 try, catch, finally 블록을 사용합니다. 이를 통해 예외 처리가 가능하며, 런타임 에러를 잡아 안정적으로 처리할 수 있습니다.

try {
  // 예외 발생 가능한 코드
  throw new Error('예외 발생!');
} catch (error) {
  console.error(error);
} finally {
  // 정리 코드
}

2. 사용자 정의 예외 처리

사용자 정의 예외를 만들어서 특정 예외 상황에 대해 명확하게 처리할 수 있습니다.

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

try {
  throw new CustomError('사용자 정의 예외 발생!');
} catch (error) {
  console.error(error);
}

3. 에러 핸들링과 반환 타입

함수나 메서드에서 예외가 발생할 수 있는 경우, try/catch를 사용하여 에러를 잡고 적절한 처리를 한 후 반환 타입을 명확히 지정하는 것이 좋습니다.

function divide(x: number, y: number): number {
  try {
    if (y === 0) {
      throw new Error('0으로 나눌 수 없습니다.');
    }
    return x / y;
  } catch (error) {
    console.error(error);
    return -1;
  }
}

4. 타입 가드와 예외 처리

타입 가드를 사용하여 런타임 예외를 방지하고, 예외를 타입 안전하게 처리할 수 있습니다.

interface Circle {
  kind: 'circle';
  radius: number;
}

interface Square {
  kind: 'square';
  sideLength: number;
}

type Shape = Circle | Square;

function getArea(shape: Shape): number {
  switch (shape.kind) {
    case 'circle':
      return Math.PI * shape.radius ** 2;
    case 'square':
      return shape.sideLength ** 2;
    default:
      const _exhaustiveCheck: never = shape;
      return _exhaustiveCheck;
  }
}

5. 비동기 예외 처리

비동기 작업에서 예외를 처리할 때는 async/await를 활용하여 try/catch를 사용합니다.

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    return data;
  } catch (error) {
    console.error(error);
    return null;
  }
}

타입스크립트에서는 try/catch와 같은 구조를 통해 예외를 안전하게 처리할 수 있으며, 타입 안전성을 유지하면서 예외 상황을 다룰 수 있습니다.