[Java] 사용자 정의 예외 (Exception) 만들기
자바 프로젝트를 하다보면 업무로직 안에서 고의로 예외를 발생시키는 부분들이 있다.
ex) 잔고 보다 많은 금액을 출금 요청 시 > 오류발생
어플리케이션 예외 : 개발자가 직접 정의해서 만들어야 하므로 사용자 정의 예외라고도 한다.
일반 예외로 선언 시 : Exception 상속
실행 예외로 선언 시 : RuntimeException 상속
CustomException 은 Exception 을 상속하기 때문에 컴파일러가 체크 하는 예외(일반 예외) 이다.
따라서 소스 코드 작성 시 try - catch 블록으로 예외 처리가 필요하다.
파일 구조
BbsServiceImpl > BbsService > BbsController
1. 예외 작성하기
public class CustomException extends Exception {
//생성자는 두 개를 선언하는 것이 일반적이다.
// 1. 매개 변수가 없는 기본 생성자
public CustomException() {}
// 2. 예외 발생 원인(예외 메시지)을 전달하기 위해 String 타입의 매개변수를 갖는 생성자
public CustomException(String message) {
super(message); // RuntimeException 클래스의 생성자를 호출합니다.
}
}
2. 예외 발생시키
- 게시판 목록에서 제목이 "에러" 인것이 있으면 예외를 발생시킨다.
public void bbsListTest() throws Exception { // 예외 떠넘기기
List<BbsDto> list = bbsDao.selectListAllBbs();
for(BbsDto dto : list) {
if( "에러".equals(dto.getTitle()) ) {
throw new CustomException("예외 발견 : "+dto.getBno());
}
}
}
- throws란?
예외가 발생한 곳에서 try ~ catch 블록으로 예외를 직접 처리할 수 있지만, 자신이 직접 처리하지 않고,
메서드를 호출한 곳으로 예외를 위임(떠넘김) 할 때 throws 키워드를 사용한다.
예외 처리를 위임받은 메서드는 다시 예외 처리에 대한 책임이 발생하며, 자신이 직접 처리하거나 또 다른 곳으로 위임할 수 있다.
3. 예외 호출 (컨틀롤러)
@GetMapping("/")
public void main() throws Exception{
bbsService.forEachExcepton();
}
-결과
kr.co.study.CustomException: 예외 발견 : 113]을(를) 발생시켰습니다.
kr.co.study.CustomException: 에외 발견 : 113
at kr.co.study.bbs.service.impl.BbsServiceImpl.forEachExcepton(BbsServiceImpl.java:172)
- 컨트롤러까지 예외메세지를 넘길 수 있다.
@GetMapping("/")
public void main() throws Exception{
try {
bbsService.forEachExcepton();
} catch(CustomException e) { // CustomException 예외가 발생한 메세지 얻기
log.info("HomeController.main 예외 호출");
System.out.println(e.getMessage()); //bbsListTest 메서드에서 발생한 예외 문구
e.printStackTrace(); // 예외 추적 후 출력
}
}
-결과
INFO : kr.co.study.home.controller.HomeController - HomeController.main 예외 호출
예외 발견 : 113
kr.co.study.CustomException: 에외 발견 : 113
이런식으로 꼭 자바에서 발생하는 예외가 아닌 사용자가 임의로 업무의 관한 예외를 발생시킬 수 있다.