자바의 정석 - 연결된 예외

Yohan·2024년 2월 1일
0

연결된 예외 (chained exception)

  • 한 예외가 다른 예외를 발생시킬 수 있다.
  • 예외 A가 예외 B를 발생시키면, A는 B의 원인 예외(cause exception)
  • Throwable initCause(Throwable cause) - 지정한 예외를 원인 예외로 등록
  • Throwable getCause() - 원인 예외를 반환
void install() throws InstallException {
	try {
    	startInstall(); // SpaceException 발생
        copyFiles();   
    } catch (SpaceException e) {
    	InstallException ie = new InstallException("설치중 예외발생"); // 예외 생성 !!!
        ie.initCause(e); // InstallException의 원인 예외를 SpaceException로 설정
        throw ie; // InstallException 발생
    } catch (MemoryException me) {
    	...
    }
}
  • SpaceException를 원인 예외로하는 InstallException라는 예외를 생성 (InstallException 라는 예외 생성해서 SpaceException를 안에 넣는 것)

연결된 예외를 사용하는 이유

  1. 여러 예외를 하나로 묶어서 다루기 위해서
    -> 위 예시에서 보듯이 InstallException에 SpaceException 넣고 MemoryException 넣고 ... catch문을 이용해서 넣으면됨)

  2. checked 예외 (Exception 자손)를 unchecked 예외 (RuntimeException 자손)로 변경하려 할 때

// SpaceException, MemoryException 둘 다 예외 필수 처리
static void startInstall() throws SpaceException, MemoryException {
	if(!enoughSpace())
    	throw new SpaceException("설치할 공간이 부족합니다.");
    
    if(!enoughMemory())
    	throw new MemoryException("메모리가 부족합니다.");
}

class SpaceException extends Exception {
	SpaceException(String msg) {
    	super(msg);
    }
}

// RuntimeException 로 MemoryException을 감싸면 unchecked 예외 (예외 선택 처리)로 변경가능!

// SpaceException 예외 필수 처리, MemoryException 예외 선택 처리
static void startInstall() throws SpaceException {
	if(!enoughSpace())
    	throw new SpaceException("설치할 공간이 부족합니다.");
    
    if(!enoughMemory())
    	throw new RuntimeException(new MemoryException("메모리가 부족합니다."));
        // MemoryException을 RuntimeException의 원인 예외로 등록
}		// RuntimeException(Throwable cause) 꼴, initCause대신 RuntimeException 생성자 씀
profile
백엔드 개발자

0개의 댓글