[Java] 4. Exception 기본 설명


Exception 기본적인 설명 예제이다,



1. try ~ catch 문

try {
    //예외가 발생할 수 있는 로직 블럭
} catch (Exception e1) {
    //Exception1 이 발생 했을 경우 처리 로직
} catch (Exception e3) {
    //Exception3 이 발생 했을 경우 처리 로직
}



2. printStackTrace() 와 getMessage()

printStackTrace()

//예외발생 당시의 호출스택(call stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
ex.printStackTrace();
java.lang.Exception: 강제 에러 발생
	at com.example.exception.sample.ExExceptionSample.main(ExExceptionSample.java:6)

Process finished with exit code 0


getMessage()

//발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
System.out.println("에러 메시지: " + e.getMessage());
에러 메시지: 강제 에러 발생



3. 강졔 예외 발생

throw new Exception("강제 에러 발생");
Exception e = new Exception("강제 에러 발생");//예외 객체 생성
try {
    throw e;//예외를 발생시킴
    //throw new Exception("강제 에러 발생");

} catch (Exception ex) {

    ex.printStackTrace();
    System.out.println("에러 메시지: " + ex.getMessage());
}



4. finally 블럭

finally 블럭은 예외 발생 여부와 상관없이 처리되는 로직이다. 임시 데이터들이나 리소스를 반환 및 정리하는 로직으로 많이 사용했다.

Exception e = new Exception("강제 에러 발생");//예외 객체 생성
try {
    throw e;//예외를 발생시킴
    //throw new Exception("강제 에러 발생");

} catch (Exception ex) {
    ex.printStackTrace();
    System.out.println("에러 메시지: " + e.getMessage());

} finally {
    System.out.println("예외 발생 여부와 상관없이 처리되는 블럭");
}



5. 예외 떠넘기기

아래 예제 코드는 method2()에서 에러 발생시에 method1()을 통해 main() 메서드까지 에러를 부모에게 넘긴다.

public static void main(String... args) {

    try {
        method1();

    } catch (Exception ex) {
        ex.printStackTrace();
        System.out.println("에러 메시지: " + ex.getMessage());
    }
}

private static void method1() throws Exception {
    method2();
}

private static void method2() throws Exception {
    throw new Exception("에러 발생");
}



6. 예외 되 던지기(exception re-throwing)

호출한 메서ㄷ와 호출 된 메서드에서 예외처리가 필요시에 사용된다.
업무상에서 에러 발생 시에 예외처리한 후에 다시 에러를 발생 시켜서 부모에게 에러를 전파시켜 부모의 예외처리 로직을 실행시킬 때 활용된다. (이전에 추가 개발 된 이후에 추가 개발건에서 사용한 적이 있다.)

public static void main(String... args) {

    try {
        method1();

    } catch (Exception ex) {
        System.out.println("main() 에서 예외 처리");
    }
}

private static void method1() throws Exception {
    try {
        throw new Exception("메서드 1 에러 발생");
    } catch (Exception e) {
        System.out.println("method() 에서 예외 처리");
        throw e;//다시 에러를 발생 시켜서 부모에게 에러를 전파 시킨다.
    }
}



7. 사용자 정의 예외 만들기

사용자 정의 예외를 만들어서 에러들을 처리시에 에러코드들을 이용하면 서비스 후처리에서 관리가 편리하기에 서비스에 성격에 맞게 구현하면 용이하다.


//사용자 정의 구현시 조상을 Exception 과 RuntimeException 중에서 선택한다.
class CustomException extends Exception {

    private final int ERR_CODE;

    CustomException(String msg, int errCode) {
        super(msg);
        ERR_CODE = errCode;
    }

    CustomException(String msg) {
        this(msg, 100);
    }

    public int getErrCode() {
        return ERR_CODE;
    }
}

public class ExCustomException {

    public static void main(String... args) {

        //사용자 정의 예외처리시에 서비스에 맞게 에러코드를 관리가 편리함
        CustomException e = new CustomException("사용자 정의 예외 에러 발생", 101);
        try {
            throw e;//예외를 발생시킴
            //throw new Exception("강제 에러 발생");

        } catch (CustomException ex) {
            System.out.println("에러 메시지 :"+ ex.getMessage());
            System.out.println("에러 코드 :"+ ex.getErrCode());
        }
    }
}