Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

연결된 예외(chained exception) 본문

Java/JAVA2

연결된 예외(chained exception)

빌드이너프 2023. 6. 25. 10:03

연결된 예외(chained exception)

한 예외가 다른 예외를 발생시킬 수 있다

예외 A가 예외 B를 발생시키면 A는 B의 원인예외(cause exception)이다

Throwable 링크 : Exception과 Error의 조상

Throwable initCause(Throwable cause) 지정한 예외를 원인 예외로 등록
Throwable getCause() 원인 예외를 반환

 

하나의 예외 안에 또다른 예외를 포함시킨다

public class Throwable implements Serializable {
    ...
    private Throwable cause = this; // 객체 자신(this)를 원인 예외로 등록
    ...
    public synchronized Throwable initCause(Throwable cause) {
    ...
        this.cause = cause; // cause를 원인 예외로 등록
        return this;
    }
    ...
}

 

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) {
    ...

 

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

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

void install() throws InstallException {
    try {
        strarInstall(); // SpaceException 발생
        copyFiles();
    } catch (SpaceException e) [
        InstallException ie = new InstallException("설치 중 예외 발생"); // 예외 생성
        ie. initCuase(e); // InstallException의 원인 예외를 SpaceException으로 지정
        throw ie; // InstallException을 발생시킨다
    } catch (MemoryException me) {
    ...

왼쪽: SpaceException 공간이 부족하다는 정보만 나옴

오른쪽: 실제 발생한 예외는 SpaceException, 발생한 예외는 InstallException

            설치 중에 예외가 발생했다는 대략정인 정보를 주고, 세부정보로 공간이 부족하다는 정보를 준다

 

2. checked 예외를 unchecked 예외로 변경하려 할 때(필수처리를 선택처리로 바꿀 때 사용)

static void startInstall() throws SpaceException, MemoryException {
    if(!enoughSpace()) // 충분한 설치공간이 없으면
        throw new SpaceException("설치할 공간 부족");
    
    if(!enoughMemory()) // 충분한 메모리가 없으면
        throw new MemoryException("메모리 부족");
}

 

이미 SpaceException이 RuntimeException이 아닌 Exception로 많이 사용되고 있는 경우

RuntimeException으로 바꾸기 어렵다

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

 

이때 RuntimeException을 하나 만들고 그 안에 SpaceException을 포함시킨다

(MemoryException 제거, RuntimeException 만들고 원인 예외[MemoryException]로 등록)

static void startInstall() throws SpaceException {
    if(!enoughSpace()) // 충분한 설치공간이 없으면
        throw new SpaceException("설치할 공간 부족");
    
    if(!enoughMemory()) // 충분한 메모리가 없으면
        throw new RuntimeException(new MemoryException("메모리 부족"));
}

 

연결된 예외 정리

어떤 예외를 다른 예외로 감싸는 것

세부적인 예외를 포괄적인 예외로 감쌀 때 사용

checked 예외를 unchecked 예외로 변경(필수처리를 선택처리로 바꿀 때 사용)

'Java > JAVA2' 카테고리의 다른 글

toString(), toString()의 오버라이딩  (0) 2023.06.25
hashCode()  (0) 2023.06.25
사용자 정의 예외 만들기, 예외 되던지기  (0) 2023.06.24
checked 예외, unchecked 예외  (0) 2023.06.22
예외 발생시키기  (0) 2023.06.22