예외(Exception) (3)

김재익·2023년 6월 16일
0

JAVA

목록 보기
8/18
post-thumbnail

Chained Exception

  • 예외는 다른 예외를 유발할 수 있다.
  • 예외 A가 예외 B를 발생시켰다면, 예외 A는 B의 원인 예외외인 것.
  • 원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시키는데, 이를 예외 연결이라 한다
  • 예외 연결을 하는 이유
    • 여러 가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함
    • checked exception을 unchecked exception으로 포장(wrapping)하는데 유용하게 사용되기도 함
// 연결된 예외 
public class main {

    public static void main(String[] args) {
        try {
            // 예외 생성
            NumberFormatException ex = new NumberFormatException("가짜 예외이유");

            // 원인 예외 설정(지정한 예외를 원인 예외로 등록)
            ex.initCause(new NullPointerException("진짜 예외이유"));

            // 예외를 직접 던집니다.
            throw ex;
        } catch (NumberFormatException ex) {
            // 예외 로그 출력
            ex.printStackTrace();
            // 예외 원인 조회 후 출력
            ex.getCause().printStackTrace();
        }

        // checked exception 을 감싸서 unchecked exception 안에 넣습니다.
        throw new RuntimeException(new Exception("이것이 진짜 예외 이유 입니다."));
    }
}

// 출력
Caused by: java.lang.NullPointerException: 진짜 예외이유
  • 원인 예외를 다루기 위한 메소드
    • initCause()
      • 지정한 예외를 원인 예외로 등록하는 메소드
    • getCause()
      • 원인 예외를 반환하는 메소드

실제 예외 처리

실질적으로 예외를 처리하는 방법으로는 예외 복구, 예외 처리 회피, 예외 전환 이 있다.

예외 복구

public String getDataFromAnotherServer(String dataPath) {
	try {
    	return anotherServerClient.getData(dataPath).toString();
    } catch (GetDataException e) {
    	return defaultData;
	}
}
  • 실제로 예외 처리를 하고 프로그램을 정상 상태로 복구하는 방법
  • 가장 기본적인 방식이지만, 현실적으로 복구가 가능한 상황이 아닌 경우가 많거나 최소한의 대응만 가능한 경우가 많기 때문에 자주 사용되지는 않는다.

예외 처리 회피

public void someMethod() throws Exception { ... }

public void someIrresponsibleMethod() throws Exception {
		this.someMethod();
}
  • someMethod()에서 발생한 에러가 someIrresponsibleMethod()의 throws를 통해서 그대로 다시 흘러나가게 된다, 물론 같은 객체 내에서 이런일은 하지 않는다, 예외 처리 회피를 보여주기 위한 예시 코드.
  • 관심사를 분리해서 한 레이어에서 처리하기 위해서 이렇게 에러를 회피해서 그대로 흘러 보내는 경우도 있다.

예외 전환

public void someMethod() throws IOException { ... }

public void someResponsibleMethod() throws MoreSpecificException {
	try {
    	this.someMethod();
	} catch (IOException e) {
    	throw new MoreSpecificException(e.getMessage());
	}
}
  • 예외 처리 회피와 방법이 비슷하지만, 조금 더 적절한 예외를 던져주는 경우이다.
  • 보통은 예외 처리에 더 신경쓰고 싶은 경우나, 오히려 RuntimeException처럼 일괄적으로 처리하기 편한 예외로 바꿔서 던지고 싶은 경우 사용한다.
profile
개발자호소인

0개의 댓글