Java Try-Catch-Finally문

song yuheon·2023년 8월 20일
0
  • 예외처리 동작 흐름
public static void main(String[] args) {
    OurClass ourClass = new OurClass();
    try{
        ourClass.thisMethodIsDangerous();
    }catch (OurBadException e){
        System.out.println(e.getMessage());
    }finally {
        System.out.println("예외 handling 완료");
    }
}


public OurBadException(){
    super("위험한 행동 예외 처리");
}
  1. OurBadException의 생성자가 호출됨
  2. 해당 예외 클래스의 생성자에서는 부모 클래스인 Exception의 생성자에 "위험한 행동 예외 처리"라는 문자열을 전달
  3. 이후 OurBadException 객체가 생성되어 메모리에 할당
  4. 생성된 OurBadException 객체가 throw 키워드에 의해 던져짐
  5. 이때, 던져진 예외는 가장 가까운 catch 블록에서 처리되거나, 처리되지 않았을 경우 상위 호출 스택으로 전파

예외 클래스 구조

  • checked Exception & Unchecked Exception

    • checked Exception : 사전에 우리가 체크한 예외, 우리가 알고 있어서 사전에 예외처리 한 예외
      -> 예외처리 안할 시 컴파일 시 오류 발생
    • Unchecked Exception : 사전에 우리가 몰랏던 예외
  • Java Throwable Class
    Throwable 클래스가 Object 클래스를 상속
    Throwable 클래스 = 에러(Error) + 예외(Exception) 클래스
    => 거의 대부분의 상황에 맞는 에러들은 이미 구현
    없다면 특정 에러를 더 구체화해서 내가 직접 정의하고 구현

Chained Exception, 실제 예외 처리

  • 연결된 예외

    • 예외는 다른 예외 유발
  • 예외 연결이란?
    원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시키는 것

  • 예외를 연결하는 이유
    여러가지 예외를 묶어서 하나의 분류로 다루기 위해
    혹은 checked exception을 unchecked exception으로 wrapping하기 위해

  • 원인 예외를 다루기 위한 메소드

    • initCause()
      지정한 예외를 원인 예외로 등록
    • getCause()
      원인 예외를 반환
  • 예외 처리를 위한 전략

    1. 예외 복구
      현실적으로 최소한의 대응만 가능
      자주 사용 X
    public String getDataFromAnotherServer(String dataPath) {
            try {
                    return anotherServerClient.getData(dataPath).toString();
            } catch (GetDataException e) {
                    return defaultData;
            }
    }
    1. 예외 처리 회피
      한 레이어에서 처리하기 위해서 이렇게 에러를 회피해서 그대로 흘러 보내는 경우
    public void someMethod() throws Exception { ... }
    
    public void someIrresponsibleMethod() throws Exception {
            this.someMethod();
    }
    1. 예외 전환
      예외처리 회피하기의 방법과 비슷하지만, 조금더 적절한 예외를 던져주는 경우
    public void someMethod() throws IOException { ... }
    
    public void someResponsibleMethod() throws MoreSpecificException {
            try {
                this.someMethod();
            } catch (IOException e) {
                throw new MoreSpecificException(e.getMessage());
            }
    }
profile
backend_Devloper

0개의 댓글