ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chained Exception, 실제 예외 처리 방법
    Java/Java 문법 종합반 강의 정리 2024. 1. 2. 15:45

    연결된 예외(Chained Exception)
    - 예외는 다른 예외를 유발할 수 있다.
    - 예외 A가 예외 B를 발생시켰다면, 예외 A는 B의 원인 예외이다.
    - 원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시키는데, 이를 예외 연결이라고 한다.

    예외를 연결하는 이유는?
    - 여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함이다. 트래킹(trekking)이 편함
    - checked exception 을 unchecked exception 으로 포장(wrapping) 하는데 유용하게 사용되기도 한다.

    원인 예외를 다루기 위한 메소드
    - initCause()
     - 지정한 예외를 원인 예외로 등록하는 메소드
    - getCause()
     - 원인 예외를 반환하는 메소드

    // 연결된 예외 
    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: 진짜 예외이유

     

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

     

    예외 복구

    public String getDataFromAnotherServer(String dataPath) {
    		try {
    				return anotherServerClient.getData(dataPath).toString();
    		} catch (GetDataException e) {
    				return defaultData;
    		}
    }

    - 실제로 try-catch로 예외를 처리하고 프로그램을 정상 상태로 복구하는 방법이다.

    - 가장 기본적인 방식이지만, 현실적으로 복구가 가능한 상황이 아닌 경우가 많거나 최소한의 대응만 가능한 경우가 많기 때문에 자주 사용되지는 않는다.

     

    예외 처리 회피

    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 처럼 일괄적으로 처리하기 편한 예외로 바꿔서 던지고 싶은 경우 사용한다.

     

     

    'Java > Java 문법 종합반 강의 정리' 카테고리의 다른 글

    프로세스와 쓰레드  (1) 2024.01.03
    제네릭의 개념  (2) 2024.01.02
    에러와 예외  (0) 2024.01.02
    default 메서드, static 메서드, 형변환  (2) 2024.01.01
    접근 제어자  (2) 2023.12.31
Designed by Tistory.