[클린코드] 7장 : 오류 처리

목록으로 돌아가기

코드의 많은 부분은 오류를 처리하는 코드가 차지하고 있으므로, 오류 처리와 깨끗한 코드는 연관성이 있다.

그러한 이유로 오류 처리를 현명하게 하여 깨끗한 코드를 유지해야한다

  • 오류 코드보다 예외를 사용하라
    • 오류 플래그를 사용하여 오류를 반환하는 것보다 오류 발생 시 예외를 던지게 하면 호출자 코드가 깔끔해진다.

  • try-catch-finally 문부터 작성하라
    • 오류를 잘 잡아주기 때문이다. 호출자가 기대하는 상태를 정의하기 쉬워지며, 프로그램 상태의 일관성을 유지해준다.
    • 범위를 정의하고, TDD를 통해 나머지 논리를 추가해준다.

  • 미확인(unchecked) 예외를 사용하라
    • 미확인 예외란 실행 단계에서 확인되며, 명시적인 처리를 강제하지 않는 예외다.
    • 확인된 예외는 throw절을 추가하기 때문에 코드의 최하단부터 상단까지 연쇄적으로 수정해야 한다. 그러므로 캡슐화가 깨진다.

  • 예외에 의미를 제공하라
    • 오류 메세지에 의미를 담아 예외를 처리하여 오류 발생 원인 및 위치를 찾기 쉽게 작성한다.

  • 호출자를 고려하여 예외 클래스를 정의하라
    • 모든 예외를 호출자가 잡아내도록 하지 않고, 호출 라이브러리 API를 감싸서 예외 유형을 하나로 반환하면 프로그램 사이의 의존성을 줄일 수 있다.

  • 정상 흐름을 정의하라
    • 특수 사례 패턴 방식을 통해 클래스를 만들거나, 객체를 조작하여 특수 사례를 처리한다.
    • 그렇다면 객체가 예외 상황을 캡슐화하여 처리하므로, 코드가 이를 처리할 필요가 없어지게 된다.

  • null을 반환하지 마라
    • null을 반환하는 코드가 많다면, 이 예외를 누군가 실수로 놓칠 수 있다.

  • null을 전달하지 마라
    • 의도한 바가 아니라면 피하자. 적절히 처리하기 어려울 수 있다.
    • 차라리 assert문을 사용하자.

본문에 대한 예시

제일 먼저 확인 할 수 있었던 예시는 try catch문이다. 이는 아마 대부분의 개발자들이 열심히 사용하고 있을 것이다. 이 로직을 사용하게 되면 자신이 원하는 구동을 구현할 수 있기 때문이다. try문에 원하는 동작 및 예외가 되어야 할 사항을 적으면 catch문에서 알아서 잡아준다.

아래의 코드는 try catch 문에 대한 예시다.

function DataValidationCheck(dataToSubmit: BookModel) {
    try {
      if (
        dataToSubmit.serialNumber.length === SERIAL_NUMBER_LENGTH &&
        dataToSubmit.author !== "" &&
        dataToSubmit.publisher !== "" &&
        dataToSubmit.title !== ""
      ) {
        setValidation(true)
        
      } else {
        setValidation(false)
        throw new Error("데이터 형식이 올바르지 않습니다.");
      }
    } catch (e: any) {
      setValidation(false)
      throw new Error("데이터 형식이 올바르지 않습니다.");
    }
  }

catch에 잡히고자 하는 조건 조건문을 통해 넣었고, 나머지는 오류로 잡히게 하였다. 이를 통해 한 가지 정상 흐름을 제시하고 나머지를 오류로 예외 처리하게 하였다. 또한 호출 라이브러리를 API로 감싸 하나의 예외 유형을 반환하게 하였기에 위의 예외 처리 시 지키면 좋은 조건 중 다수를 충족한 코드이다. throw를 통해 조건에 맞지 않는 오류를 예외로 던졌다. 본문 중 ‘오류 코드보다 예외를 사용하라’를 만족하는 것으로, 이를 통해 예외임을 가시적으로 나타낼 수 있다.

여기서 아쉬운 점이 있다면, 이미 if로 조건을 처리하였기 때문에 else로 다시 처리를 할 필요가 없어 보이는 점이다. 더 많은 조건을 충족하게 하려면 예외에 의미를 부여할 수 있다. setValidation() 부분에서 오류에 따른 위치 및 이유를 나타날 수 있게 한다면 더 좋은 코드가 될 것이다. 그리고 에러의 메시지 역시 세분화해서 알려준다면 ‘예외에 의미를 제공하라’를 만족할 수 있을 것이다.

author-profile
Written by 상 한규

댓글