예외처리 (Exception Handling)

박영준·2023년 7월 6일
0

Java

목록 보기
104/112

1. 정의

프로그램 실행 시, 발생할 수 있는 예상 못한 예외의 발생을 대비한 코드를 작성하는 것

주의! 예외처리 개수
반드시 '부모 클래스의 정의된 메서드 개수 > 자식 클래스의 정의된 메서드 개수'

참고: 오버로딩, 오버라이딩

2. 필요성

  • 예외 처리를 제대로 하지 못하면, 서버의 문제인지 클라이언트의 문제인지 판단이 어려움

  • 에러 발생 시 전달되는 본문을 바탕으로, 프론트 개발자들과 소통/공유가 필요

3. 잘못된 예외 처리

1) 예외 블랙홀

(1) 오류로 인한 예외를 무시하고 진행

try {
    ...
} catch(SQLException e) {
}

프로그램 실행 中 오류로 인해 예외가 발생했으나, 무시하고 계속 진행해버린다.

그 결과로
1. 비정상적인 동작
2. 메모리나 리소스가 소진
3. 예상치 못한 문제
4. 시스템 오류 or 이상한 결과의 원인 찾기가 어려움

(2) 로깅을 남겨두는 경우

try {
    ...
} catch(SQLException e) {
    System.out.println(e);
}

4. CustomException

1) 정의

기본적으로 정의된 클래스 외에도, 필요에 따라 새로운 예외 클래스를 정의해서 사용할 수도 있다.

class MyException extends Exception {
	// 필드
	private final int ERR_CODE;		// 생성자를 통해, 초기화함
    
    // 생성자
    MyException(String msg, int errCode) {
    	super(msg);
        ERR_CODE = errCode;
	}
    
    ...

}
  • 에러 메시지와 에러코드 값도 저장할 수 있도록 만들었다.

2) 표준 예외 vs CustomException

어떤 것이 유리한 예외 처리 방법일까?

표준 예외

  • 배우기 쉽고 사용하기 편리한 API를 만들 수 있다.

  • 표준 예외를 사용한 API는 가독성이 높다.

  • 예외를 재사용할 수 있다.
    → 예외 클래스의 수가 적을수록, 프로그램의 메모리 사용량↓ , 클래스 적재 시간↓

CustomException

  • 예외 발생 조건이 해당 예외 문서에 기술된 것과 일치하지 않는 경우
    → 사실, 표준 예외가 있기 때문에 자주 발생하는 상황은 아니다.

  • 여러 예외와 맞물려, 어느 하나를 선택하기 모호한 경우 (즉, 비즈니스 로직의 명확성을 높이고 싶은 경우)

    • 숫자 만큼 카드를 나눠주는 메서드가 있다.
      인자로 전달된 숫자가 너무 크다면,
      IllegalArgumentException ("인자의 값이 너무 크다"는 뜻의) or IllegalStateException ("객체의 현 상태로는 메서드 호출을 처리할 수 없다"는 뜻의) 을 발생시킬 수 있다.
      → 이 경우, InvalidCardCountException 같은 이름의 예외를 생성할 수 있다.
  • 클라이언트 코드에 대한 추가적인 정보 혹은 행동을 제공하고 싶은 경우

    • requestedUsername() : 해당 이름은 사용할 수 없음을 알려주는 기능
    • availableNames() : 대신 사용할 수 있는 이름을 보여주는 기능

5. Java 에서 예외처리

참고: 예외처리 - Java 에서

6. Spring 에서 예외처리

참고: 예외처리 - Spring 에서

profile
개발자로 거듭나기!

0개의 댓글