Sqsung DevLog

<타입스크립트 프로그래밍> 7장: 에러 처리 - 정리 본문

TypeScript

<타입스크립트 프로그래밍> 7장: 에러 처리 - 정리

sqsung 2023. 6. 5. 14:48

7장: 에러 처리

"이번 장에서는 타입스크립트에서 에러를 표현하고 처리하는 가장 일반적인 패턴 네 가지를 소개한다"

7-1. null 반환

  • 타입 안전성을 유지하면서 에러를 처리하는 가장 간단한 방법은 null을 반환하는 것이다
  • 하지만 이런 경우 문제의 원인을 파악하고 어렵고, 조합이 어려워진다. 모든 연산에서 null을 학인해야 하므로 연산을 중첩하거나 연결할 때 코드가 지저분해진다

7-2. 예외 던지기

  • null을 반환하는 것보다 예외를 던지는 게 더 좋다

  • 어떤 문제인지에 따라 대처가 가능할 수 있고, 디버깅에 도움되는 메타데이터를 얻을 수 있다

    function parse(birthday: string): Date {
      let date = new Date(birthday);
    
      if (!isValid(date)) {
        throw new RangeError('Enter a dae in the form of YYYY/MM/DD');
      }
    
      return date;
    }
  • 다른 헝태의 RangeError를 던질 수 있게 하려면 에러를 서브클래싱하여 더 구체적으로 표현하면 된다

    class InvalidDateFormatError extends RangeError { };
    class DateIsInTheFutureError extends RangeError { };

7-3. 예외 반환

  • 타입스크립트는 throws문을 지원하지 않지만 유니온 타입을 이용해 비슷하게 흉내낼 수 있다

    function parse(birthday: string): Date | InvalidDateFormatError | DateIsInTheFutureError {
      let date = new Date(birthday);
    
      if (!isValid(date)) {
        return new InvalidDateFormatError('Enter a date in the form YYYY/MM/DD');
      }
    
      if (date.getTime() > Date.now()) {
        return new DateIsInTheFutureError('Are you a timelord (ㅋㅋ)');
      }
    
      return date;
    }
  • 이제 parse 메서드의 사용자는 모든 세 가지 상황 (InvalidDateFormatError, DateIsInTheFutureError, 파싱 성공)을 처리해야 하며 그렇지 않으면 컴파일 타임에 TypeError가 발생한다

7-4. Option 타입

  • 특수 목적 데이터 타입을 사용해 예외를 표현하는 방법도 있다

    • 단점: 이런 데이터 타입을 사용하지 않는 다른 코드와는 호환되지 않음
    • 장점: 여러 연산을 연쇄적으로 수행할 수 있게 됨
  • 가장 많이 사용되는 세 가지로는 Try, Option, Either 타입들이 있으며, 자바스크립트에서 기본으로 제공되는 않으므로 해당 타입들을 사용하기 위해서는 NPM에서 찾아서 설치하거나 직접 구현해야 한다

  • Option 타입은 특정 값을 반환하는 대신, 값을 포함하거나 포함하지 않는 컨테이너를 반환하는 것이 핵심이다

    function parse(birthday: string): Date[] {
      let date = new Date(birthday);
    
      if (!isValid(date)) return [];
      else return [date];
    }
    
    const birthday = parse('1994/03/30');
    birthday.map(_ => _.toISOString()).forEach(_ => console.info('Date is', _));
  • null 반환 방법처럼 Option 방식도 에러가 발생한 이유에 대해서는 알려주지 않는다 (단지 무언가 잘못됐음을 알려줌). 하지만 위 예제처럼 있을 수도 있고, 없을 수도 있는 birthday 값에 여러 동작을 연쇄적으로 수행할 때 Option의 진가가 발휘된다