[Java 예외] 사용자 정의 예외 작성 부수기

RuntimeException(Unchecked Exception)은 주로 프로그래머의 실수로 발생하므로 예외 처리보다는 디버깅이 우선, 사용자 정의 예외는 비즈니스 로직에 맞는 의미 있는 예외 처리를 위해 사용- 대부분 Exception 또는 RuntimeException 클래스를 상속 받아 사용자 정의 예외 작성


참고 예외 계층

Image



사용자 정의 예외 생성

대부분 Exception 또는 RuntimeException 클래스를 상속 받아 사용자 정의 예외 작성
다만, RuntimeException은 디버깅 대상으로 보자!


Image



코드를 보고 이해 - Exception상속한 EmpException

RuntineException은 디버깅 대상으로 주로 보니까 checked Exception 을 코드로 보겠다.

runtime exception의 묵시적 예외 처리와 다르게 명시적 예외 처리이다.


아래 코드 흐름: 내부 메서드(DAO, Service, Controlle 클래스꺼)마다 throw new EmpException 으로 예외를 발생시켜주고 -> throws EmpException 으로 예외를 책임전가 함으로써 최초의 메서드 호출한 main쪽이 예외를 처리하게 됨.(catch문에 걸리게 된다!)

Image

Image

Image

Image

Image



예시 코드로 좋은 코드인지 판단해보기

1. 사용자 정의 예외 활용의 장점?

코드 흐름: getFruit2(”오렌지”) 로 배열에 “오렌지”가 있는지 체크 후 없으면 예외 발생 시켜 “…해당하는 과일은 없습니다.” 출력

Image


2. 예외를 잡고 모르쇠로 일관하면 좋지 않다.

method()는 무조건 예외로 처리하는 무책임한 코드이다.(catch 비어있음)
method2()는 디버깅을 한 코드이며, method코드보다 좋은 코드로 볼 수 있겠다.

Image


3. 예외는 예외적인 상황에서만 사용해야지?

endByException()은 예외적인 상황이 아니라 일부러 흐름 제어의 용도로 사용한 무책임한 코드다.
endByLength()는 i<nums.length 로 일부러 ArrayIndexOutOfBoundsException 예외 없이, 상태 확인 코드로 자연스럽게 제어하는 좋은 코드로 볼 수 있겠다.

Image


4. 종속적 코드는 상태 확인 메서드와 함께 사용해라.

scanner.nextInt()와 같은 상태 종속적 코드는 상태 확인 메서드와 함께 사용해야 한다.

Image

//예시: 상태 확인 메서드를 활용한 좋은 코드 
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()) {  // 상태 확인 메서드 사용
    int number = scanner.nextInt();
} else {
    System.out.println("올바른 정수를 입력하세요");
}
  • 상태 종속적 메서드: Scanner.nextInt(), Scanner.nextLine(), Scanner.nextDouble() 등은 입력 스트림에 특정 형식의 데이터가 기대되는 상태에서 동작합니다. 만약 기대되는 형식이 아닌 데이터가 입력되거나 스트림이 종료되면 InputMismatchException이나 NoSuchElementException과 같은 예외가 발생합니다.
  • 상태 확인 메서드: Scanner.hasNextInt(), Scanner.hasNextLine(), Scanner.hasNextDouble() 등은 입력 스트림에 특정 형식의 데이터가 있는지 확인하는 메서드입니다. 이 메서드를 사용하면 상태를 미리 확인하고 예외 발생을 방지할 수 있습니다.



참고) throw와 throws의 차이

throw의 경우 예외를 발생 시켜서, 상위 블럭이나 catch문으로 예외를 던진다.

throws의 경우 메서드 내에서 예외처리를 하지 않고 해당 메서드를 사용한 곳에서 예외 처리를 하도록 예외를 위로 던지는 것(책임전가)

public void checkAge(int age) throws CustomException { //throws
    if (age < 0) {
        throw new CustomException("나이는 음수일 수 없습니다"); //throw
    }
}


예외 처리는 진정한 예외 상황에서만 사용하고, 일반적인 흐름 제어는 상태 확인을 통해 처리하는 것이 바람직합니다.

댓글남기기