오늘 읽은 범위

7장 오류 처리

책에서 기억하고 싶은 내용을 써보세요.

오류 코드보다 예외를 사용하라.

  • 논리가 오류 처리 코드와 뒤섞이지 않으므로 호출자 코드가 더 깔끔해진다. Try-Catch-Finally 문부터 작성하라
  • try 블록에서 무슨 일이 생기든지 catch 블론은 프로그램 상태를 일관성 있게 유지해야 한다 미확인 예외를 사용하라
  • 확인된 예외는 캡슐화를 깨버리기 때문이다. 예외에 의미를 제공하라
  • 오류 메세지에 정보를 담아 던진다. 호출자를 고려해 예외 클래스를 정의하라
  • 감싸기 기법 : 외부 라이브러리와 프로그램 사이에서의 의존성이 줄어든다. 정상 흐름을 정의하라
  • 정상적인 흐름은 예외로 처리하지 않고, 필요하면 특수 사례 객체를 만들어서 예외 대신 정상적인 메서드 호출로 처리해도 좋다. 예외를 남발하지 마라 null을 반환하지 마라
  • null확인이 누락될 수 있고, null확인이 너무 많아질 수 있다. 대신 예외를 던지거나 특수 사례 객체를 반환하라. null을 전달하지 마라
  • 인수로 null을 넘기지 못하도록 막는 것이 좋다.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

이번 장은 내용이 좀 어려웠다. 자바 예외 개념 같은 것도 낯설기도 했고, 내가 오류 처리를 제대로 해본 경험이 많지 않아서 어렵게 느껴진 것 같다. 아무래도 프론트엔드는 백엔드처럼 구조적으로 예외 클래스를 나눠서 예외를 던지는 그런 형태는 크게 쓸 일이 많이 없을 것 같다. 네트워크 요청이나 사용자 입력 오류 등을 처리하는 경우가 많은데, 에러 바운더리와 같은 방식을 많이 쓰고 있는 것 같긴 하다. 이에 대해서 좀 더 공부해봐야할 것 같다.

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  1. 확인 예외
  • 컴파일러가 호출자에게 예외 처리를 강제하는 예외로, 예외가 발생할 수 있는 메서드를 호출할 때 반드시 try-catch로 처리하거나 throws로 던져야 컴파일이 된다.
  • 호출자에게 반드시 적절한 대처를 하도록 강제하는 의도.
  1. 미확인 예외
  • 컴파일러가 호출자에게 예외 처리를 강제하지 않는 예외로, 주로 프로그래밍 오류로 인해 발생한다.
  1. 왜 미확인 예외를 사용해야하는가?
  • 호출자에게 상세 구현을 숨기고 캡슐화를 유지하기 위해 내부 구현이 바뀌어도 호출자에서는 똑같이 사용할 수 있도록 해야한다. 🔽 잘못된 예시
function getUser(id: string): User {
  // 내부에서 DB 라이브러리를 씀
  throw new SqlException('DB error');
}
 
try {
  getUser('abc');
} catch (e) {
  if (e instanceof SqlException) {
    // DB 에러 처리
  }
}

🔽 캡슐화가 잘 된 예시

function getUser(id: string): User {
  try {
    // 내부에서 DB or 파일 or API 호출
  } catch (err) {
    throw new UserRepositoryError('User repository error', err);
  }
}
 
try {
  getUser('abc');
} catch (e) {
  if (e instanceof UserRepositoryError) {
    // 사용자 저장소 에러 처리
  }
}

공부법 공유하기