본문 바로가기
RECORDS/CleanCode

클린코드 #7

by _wavy 2024. 3. 11.

7장 오류 처리

깨끗한 오류 처리 코드를 작성하는 방법을 소개하는 장. 오류 처리를 프로그램 논리와 분리하면 독립적인 추론이 가능하므로 코드 유지보수성이 높아진다.(아래의 순서는 내가 이해하기 쉽도록 임의로 섞어서 그룹핑 해 둔 것이다.)

 

1. 오류보다 예외 처리

  • 오류 코드보다 예외 처리를 사용하라
  • 예외가 발생할 코드에서는 try-catch-finally문을 먼저 작성하라: try문에서 강제로 예외를 일으키는 테스트 케이스 작성 후 catch문을 테스트하고 난 다음, try문에는 절대 예외가 발생하지 않는다고 가정하고 코드를 작성할 수 있다.
  • 예외에 의미를 제공하라. 예외에 오류 메시지 객체(연산 이름+실패 유형)를 첨부하고, catch문에서 로깅 기능으로 오류를 기록하라

2. 예외 처리 기법

  • 메서드에서 null을 반환하거나 인수로 전달하지 마라. 대신 예외를 던지거나 특수 사례 객체를 반환한다. 외부 API가 null을 반환하는 상황에는 감싸기 메서드를 구현한다.
  • unchecked 예외(실행 단계에서 확인이 어려운 오류, 런타임 에러나 프로그래밍 오류 같은 것)는 시스템의 몫으로 남겨두라
  • 외부 라이브러리 호출시 단일 예외 처리 사용
    • 감싸기 기법
// 외부 API를 호출하는 클래스
class ExternalAPI {
  constructor() {}
  open() {
    // 외부 API 호출
  }
}

// 단일 에러 처리 객체
class ExternalAPIError extends Error {
  constructor(message) {
    super(message);
    this.name = 'External API Call Error';
  }
}

// 래퍼 클래스
class Wrapper {
  constructor() {
    this.externalAPI = new ExternalAPI();
  }

  open() {
    try {
      this.externalAPI.open();
    } catch (error) {
      throw new ExternalAPIError(error.message);
    }
  }
}

const apiWrapper = new Wrapper();
try {
  apiWrapper.open();
} catch (error) {
  reportError(error);
  logger.log(error.message, error);
} finally {
  // Clean-up code
}
  • 예외 처리를 특수 사례 패턴으로 구현하라
    • 특수 사례 패턴: 예외적인 상황을 새로운 클래스나 객체로 캡슐화해서 처리
class BaseCase {
  calculate() {}
}

class ExtraCase extends BaseCase {
  calculate() {
    // (특수 사례)
  }
}

// 예외 처리를 특수 사례로 구현
function calculateResult() {
  let result;
  try {
    result = obj.getResult();
  } catch (error) {
    result = new ExtraCase();
  }
  return result.calculate();
}

const result = calculateResult();

'RECORDS > CleanCode' 카테고리의 다른 글

클린코드 #9  (0) 2024.03.15
클린코드 #6  (0) 2024.03.10
클린코드 #5  (0) 2024.03.09

댓글