자바 예외처리

이건회·2023년 2월 21일
0

우테코

목록 보기
8/19

자바 Exception 상속 구조

  • exception의 상속 구조는 다음과 같다.
  • Throwable과 error, exception과 runtimeException의 차이는 무엇이 다를까 생각해보자

Checked Exception, Unchecked Exception

Checked Exception - Exception을 상속

  • checked exception은 컴파일 타임에 검증이 가능하다
  • 따라서 컴파일 시점에 예외가 Catch 되는지 확인한다. 즉 try/catch 사용하지 않을때 에러가 발생할 것이다.
  • Exception 이 발생하는 메소드에서 THROWs 예약어를 통해 예외를 호출 메소드에 전달해야 한다.
  • 따라서 흔히 try / catch 문 사용해서 잡히는 예외라고 보면 된다

Unchecked Exception - Runtime Exception을 상속

  • 컴파일이 아닌 런타임 시점에 예외를 확인한다. 따라서 catch를 하지 않는다

  • 예외를 throws할 필요가 없지만, 해도 무방하다

  • 그렇다면 두 예외를 왜 나눠 놨을까?

Checked Exception과 Unchecked Exception 선택 방법

  • 호출하는 메소드가 예외를 활용해 무엇인가 의미 있는 작업을 할 수 있는가? -> Checked Exception을 사용한다
  • 호출하는 메소드가 예외를 catch해 문제를 해결할 수 없다면 -> Unchecked Exception을 사용한다

-> 그러나 이 역시 기준이 모호하다. 요즘 나오는 언어들은 checked exception을 없애고 있다.
-> 결국은 처리하는 쪽에 달려있다는게 힌트라고 한다. 두 예외의 구분이 왜 있을까를 생각해보자

예외처리 잘 활용하기

복구

class Storage {
  void save(final Value value) {
    try {
      saveToDb(value);
    } catch (final DbException e) {
      saveToFile(value);
    }
  }
}
  • 예외가 발생한 문제를 정상 상태로 돌려놓는다
  • 프리코스 때 했던 재입력 기능 또한 복구다

회피

class Storage {
  void save(final Value value) throws DbException {
    saveToDb(value);
  }
}

직접 예외를 처리하지 않고 호출한 쪽으로 회피한다
그러나 고민없는 회피는 무시와 같으므로 많은 고민 후 회피를 택하자

무시

class Storage {
  void save(final Value value) {
    try {
      saveToDb(value);
    } catch (final DbException ignored) { }
  }
}

정말 무시를 할 수도 있다. 이 경우에는 더 고민해야 함...
회피는 외부에 전달까지는 하는데, 무시는 이것마저도 없다.
어떤 의도로 무시를 사용했는지가 중요하다

전환

class Storage {
  void save(final Value value) {
    try {
      saveToDb(value);
    } catch (final DbException e) { 
      throw new RuntimeException("데이터를 저장할 수 없습니다.", e);
    }
  }
}

checked Exception을 unchecked Exception으로 전환할 수 있다

class Storage {
  void save(final Value value) {
    try {
      saveToDb(value);
    } catch (final DbException e) { 
      throw new StorageException("데이터를 저장할 수 없습니다.", e);
    }
  }
}

추상화 계층(도메인, 뷰, 데이터베이스...등등 각 역할)에 맞는 적절한 예외를 만들 수 있다

-> 중요한 것은 이 예외를 어떻게 바라볼 것인가를 고민하는 것이다
-> 이펙티브자바 : 예외처리 부분을 볼 것

생각할 점

Checked Exception을 사용하는 경우와 Unchecked Exception을 사용하는 자신만의 원칙은 무엇인가?
어떠한 상황에 예외를 복구하는 것이 좋다고 생각하는가? 왜 그렇게 생각하는가?
어떠한 상황에 예외를 회피하는 것이 좋다고 생각하는가? 왜 그렇게 생각하는가?
어떠한 상황에 예외를 무시하는 것이 좋다고 생각하는가? 왜 그렇게 생각하는가?
어떠한 상황에 예외를 전환하는 것이 좋다고 생각하는가? 왜 그렇게 생각하는가?

profile
하마드

0개의 댓글