연결된 예외(chained exception)

0
  • 한 예외가 다른 예외를 발생시킬 수 있다.
  • 예외 A가 예외 B를 발생시키면, A는 B의 원인 예외(cause exception)
Throwable initCause(Throwable cause)  : 지정한 예외를 원인 예외로 등록 
// initCause : 메소드, Throwable : Exception과 Error의 조상, cause : 원인예외를 저장하기 위한 변수
Throwable getCause()  : 원인 예외를 반환

  • 원인 예외 : SpaceException
  • 새로운 예외 생성 : InstallException
    initCause 메소드로 예외ie의 원인예외로 e를 지정해줌.
    → ie와 e를 '연결된 예외'라고 함.
  • catch문은 예외를 처리해준 것이 아니라, 예외를 생성하고 연결했음.
    그리고 원인 예외를 '새로 만든 예외'에 포함시키고 throw로 예외를 발생시켰음.
    ↳ 발생시킨 예외가 InstallException이기 때문에, 맨위에 install 메소드에 throwsSpaceException이 아닌 InstallException으로 써준 것.

연결된 예외를 만드는 이유 1번

1) 여러 예외를 하나로 묶어서 다루기 위해서

  • try-catch 문에서 메소드를 실행시킬 때, 예외가 너무 많으면 catch블럭이 엄청 많아짐
    → 메소드를 쓸 때마다 많은 catch블럭들을 다 써주기가 부담스러움.
    → 예외 catch블럭을 메소드 내로 넣고, 예외를 생성해서 예외들을 연결 시켜줌
    → 다음에 메소드를 호출할때에는 새로 생성한 예외 1개만 부르면 되도록 간단하게 만들어줌.
  • install 메소드를 호출 할 때, SpaceException 이랑 MemoryException을 계속 써주기 부담스러움
  • install 메소드 내에 예외를 생성(InstallException)해서 SpaceException, MemoryException을 원인예외로 넣어줌.
  • install 호출 할 때는 throws 로 선언해준 InstallException만 써주면 됨.
  • 세부적인 예외처리는 메소드 내로 넣어주는 것임.

    ↳ 예외를 연결시켜주지 않았을 때 e.printStackTrace()로 보여지는 결과

    ↳ 예외를 연결시켜줬을 때 e.printStackTrace()로 보여지는 결과
    ↳ 발생 예외(대략적인 정보) 와 원인 예외(세부정보)가 보기 쉽게 출력됨

연결된 예외 이유 2번

2) checked 예외(Exception, 필수처리)를 unchecked예외(RuntimeException, 선택처리)로 변경하려 할 때!
→ 필수처리예외면 try-catch를 꼭 써줘야 하기 때문에 코드짤 때 너무 길어지고 불편함.
⇒ RuntimeException을 만들고 그 안에 Exception예외를 원인 예외로 등록

throw new MemoryException("메모리가 부족합니다.");
// 아래와 같이 변경 ⬇︎
throw new RuntimeException(new MemoryException("메모리가 부족합니다."));

그래서 연결된 예외란?

  • 어떤 예외를 다른 예외로 감싸는 것
  • 세부적인 예외를 포괄적인 예외로 감쌀 때
  • checked → unchecked로 변경할 때

출처

  • 자바의 정석 기초편 : ch 8- 18
profile
백엔드를 공부하고 있습니다.

0개의 댓글