You will be fine

<이펙티브 자바> 10. 예외

by BFine
반응형

69. 예외는 진짜 예외상황에만 사용하자

  • 예외는 절대 제어 흐름용으로 쓰여선 안된다
  • 잘 설계된 API라면 클라이언트가 정산적인 제어흐름에서 예외를 사용할일이 없게 해야한다.
  • Try-catch안에 코드를 넣으면 JVM이 적용할 수 있는 최적화가 제한된다.

70. 복구가능 → 검사 예외, 프로그래밍 오류에는 런타임 예외

  • 자바의 문제사항 알리는 타입 3가지
    • 검사 예외
    • 런타임 예외
    • 에러
  • 호출하는 쪽에서 복구할경우는 검사 예외를 사용하자
    • 검사예외를 던지면 catch로 잡거나 바깥으로 전파하도록 강제해야한다
  • 비검사 throwable은 두가지로 런타임 예외와 에러다
    • 잡을 필요가 없거나 잡지말아야한다.
    • 비검사 예외를 던졌다는 것은 복구 불가능이거나 득보다 실이 많다는 뜻
  • 프로그래밍 오류를 나타낼때는 런타임 예외를 사용하자
    • 대부분은 전제조건을 만족하지 못했을때 발생한다.
      • ex) 배열크기가 -1
    • 복구가능 하다면 검사 예외 ,그렇지 않다면 런타임 예외를 사용하자
    • 비검사 throwable은 모두 RuntimeException의 하위 클래스 여야 한다.

71. 필요없는 검사 예외 사용은 피하자

  • 발생한 문제를 프로그래머가 처리하여 안전성을 높이게끔 해준다

  • 검사예외를 회피하는 가장 쉬운 방법은 옵셔널을 반환하는 것이다.

    • 단점은 예외 발생이유에 대한 부가정보를 담을 수 없음
  • 검사 예외를 던지는 메서드를 2개로 쪼개 비검사 예외로 바꿀수 있다

    • Catch 블록을 비워두면 예외의 존재이유가 없어진다

    • 예외를 무시하기로 했다면 catch 안에 주석으로 남기고 변수 이름도 ignored로 바꾸자

        try{
          obj.action();
        }catch(TheCheckedException e){
         // 예외사항에 대처  
        }
      
        if(obj.actionPermitted(args)){
          obj.action();
        }else{
          // 예외사항에 대처
        }
      

72. 예외를 무시하지 말자

  • 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출전 상태를 유지해야한다.

    • 간단한 방법은 불변객체로 만들자
  • 매개변수의 유효성을 검사하자

      public Object pop(){
        if(size==0)
          throw new EmptyStackException();
        Object result = elements[--size];
      }
    • 적지않아도 비어있다면 예외를 던지지만 음수가되어 호출 실패시엔 ArrayIndexOutOfBoundsException을 던진다 (상황에 안어울린다.)
  • 임시 복사본에서 작업을 수행한뒤 완료시 원래객체와 변경해서 실패 원자성을 얻는다

  • 실패를 가로채는 복구코드를 작성하여 원래상태로 되돌리는 방법(?)

73. 가능한 한 실패 원자적으로 만들자

  • 실패순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메세지에 담아야한다.

74. 예외의 상세 메세지에 실패 관련정보를 담자

  • 검사예외는 항상 따로따로 선언하고 예외상황을 @throws 태그로 정리
    • 비검사 예외는 넣지말것

75. 메서드가 던지는 모든 예외를 문서화 하자

  • 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야한다. (예외번역)

  • 예외 연쇄란 문제의 근본 원인인 저수준 예외를 고수준 예외에 실어보내는것

      try{
        //저수준
      }catch(LowerLevelExcpetion cause){
        throw new HigherException(cause);
      }
  • 가장 최선은 저수준 메서드가 반드시 성공시켜 예외를 전파시키지 않아야한다.

76. 추상화 수준에 맞는 예외를 던지자

  • IllegalArgumentException
    • 호출자 인수가 부적절한 값을 넘길떄 사용
    • 가장 많이 사용 되는 예외
  • ConcurrentModificationException
    • 여러 스레드가 동시에 수정하려 할떄 던진다
  • UnsupportedOperationException
    • 클라이언트가 요청한 동작 대상 객체가 지원하지 않을때 던진다
  • Exception, RuntimeException , Throwable, Error는 직접 재사용하지 말자
반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기