사용 이유
기본으로 Java에서 제공하는 Exception만을 사용한다면 어떤 에러가 발생하였는지 추적을 하기 위해서는 오랜 시간이 걸릴 수 있다 하지만 사용자 정의 Exception을 사용한다면 에러를 사용자가 정의하여 발생시키기 때문에 어떤 부분에서 났는지 명확해질 수 있다
JVM의 Exception 처리 순서
프로그램 중간에 발생된 예외는 다음과 같은 순서로 처리됩니다.
- 예외 발생
- 예외를 핸들링 하는 핸들러 탐색(catch 블록)
- 예외 핸들러를 찾지 못했다면 default exception handler 실행 => 예외 출력과 함께 해당 thread 중단
특징
1. 이름으로도 정보 전달.
Custom Exception은 일차적으로 이름을 통해 예외 발생 상황에 대해 유추할 수 있는 정보를 제공한다.
2. 상세한 예외 정보를 제공.
사용자 예외 처리를 잘한다면 상세한 예외 정보를 제공할 수 있는데 이 말이 어떤 내용이냐.
EX)
API 통신을 하던중 파라미터의 값에서 빈 값이 생겨 NullPointerException이 발생하였을때 어느 메소드이고 어떤 파라미터인지 파악을 하기 위해서는 어떠한 값이 문제가 있는지 찾아야하는 경우가 대부분이다.
이런 경우에는 디버깅으로 찾는 경우가 일반적인 경우인데.
하지만 실제로 배포된 환경에서 이와 같은 문제가 생긴 경우에는 찾아내기가 어렵다.
이러한 상황을 방지하기 위해서는 Exception 로그에 잘 남겨야한다.
- 사용자 정의 예외 클래스 이름은 Exception으로 끝나는 것을 권장.
- 일반 예외로 선언할 경우 Exception을 상속하면 되고, 실행 예외로 선언할 경우에는 RuntimeException을 상속.
- 사용자 정의 예외 클래스 작성 시 생성자는 두 개를 선언하는 것이 일반적이다.
- 매개 변수가 없는 기본 생성자
- 예외 발생 원인(예외 메시지)을 전달하기 위해 String 타입의 매개변수를 갖는 생성자
public class NoSearchRequireArgException extends Exception {
private static final String message = "필수 값이 비어 있습니다.";
public NoSearchRequireArgException() {
}
public NoSearchRequireArgException(String requireVal) {
super(message + " : " + requireVal);
}
}
주로 사용되는 Exception methods
getMessage()
- String 타입의 매개변수 메시지를 갖는 생성자를 이용하였다면, 메시지는 자동적으로 예외 객체 내부에 저장되게 되는데 이 메시지를 리턴하는 함수입니다.
- 예외 메시지의 내용에는 왜 예외가 발생했는지에 대한 간단한 설명이 포함됩니다.
printStackTrace()
- 예외 발생 코드를 추적해서 모두 콘솔에 출력합니다.
- 어떤 예외가 어디에서 발생했는지 상세하게 출력해주기 때문에 프로그램을 테스트하면서 오류를 찾을 때 활용합니다.
3. 예외에 대한 응집도 향상.
클래스를 사용하는 이유는 다양한 자료형과 구조체 등과 여러 기능적인 요소들을 묶어서 관리할 수 있을 뿐 아니라 데이터를 처리하는 다양한 기능까지 함께 관리하는 문법 요소이다.
표준 Exception을 사용하을 사용한다면 함수로 분리한다 하더라도, 서로 다른 클래스에서 같은 예외가 발생한다면 책임 소재가 불분명해지고. 정적 메소드를 담은 유틸성 클래스로도 충분히 표준 예외를 사용하면서 이 문제를 해결할 수 있지만.
같은 예외 발생 장소가 많아진다면 어떤 부분에서 예외가 발생하였는지 확인 하기 어려워진다.
이와 같이 사용자 정의 예외 클래스를 사용하여서 사용자 정의 함수를 만든다면 관리 주체가 자신이기 때문에 예외에 필요한 내용(메시지, 전달할 정보)을 한 곳에서 관리를 잘 한다면 코드의 유지보수와 디버깅에 있어 큰 장점이 보일 것 이다.
'개발 > Java' 카테고리의 다른 글
[Java] JVM이란? (0) | 2023.10.24 |
---|---|
[Java] ArrayList에서 int array 변환 방법 (0) | 2023.10.23 |
[Java] Overriding 과 Overloading 차이 (0) | 2023.10.23 |
[Java] 변수의 종류 (0) | 2023.10.16 |
[Java] 접근 제어자(Access Modifier) (0) | 2023.10.16 |