2021-06-28 강의록_예외처리(사용자정의예외)

10724 단어 JavaJava

사용자 정의 예외 클래스

자바 API에서 제공하지 않는 예외.
사용자정의 예외를 정의할 때,
비즈니스 로직에 정의되어있어 예상 가능한 예외는 > Checked Exception (Exception 상속)
예상 불가능한 예외는 > Runtime Exception 으로 만들어야 한다.

대부분 Checked Exception 으로 정의함.
Runtime Exception 은 거의 만들일이 없음!

public class XXXException 
    extends [Exception | RuntimeExveption] {
       public XXXException(){		//default 생성자로, 예외클래스 이름(타입명)만 출력됨.
    	   ;;
       }
       public XXXExeption(String message){	//예외객체 만들 때, 생성자 통해 예외 메시지까지 출력함.
    	   super(message);
       }

예외 발생시키기

throw new XXXExveption();
throw new XXXExveption("메시지");
위와 같이 발생시킴.

이처럼 메소드 블록에 throw 키워드를 사용하면, 메소드 시그니처 오른쪽에 반드시 throws 절로 예외를 던져줘야 한다!
(반대로 throw 키워드가 없을 때 throws 절 사용하는것은 상관 없음!
어차피 throw 키워드는 조건이 부합했을 때에만 발생하니까)

import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor
public class Account {
	private long balance;		//현재잔고 (상태필드)
	
	public long getBalance() {	//Getter Method
		return balance;
	} //getBalance
	
	public void deposit(int money) {	//예금
		balance += money;
	} //deposit
	
	public void withdraw(int money)		//출금
		throws BalanceInsufficientException {
		
		if(balance < money) {
			//지정한 금액을 계좌에서 출금시, 잔고가 부족하면 실행
         	        //throw 키워드 >> 예외 발생시킴
			throw new BalanceInsufficientException("잔고부족 : " + (money-balance)+ " 모자람"); //예외객체 발생시켜서 throw
		} //if
		
		balance -= money;
	} //withdraw

} //end class

예외객체 Wrapping

import java.io.IOException;

import lombok.extern.log4j.Log4j2;


@Log4j2
public class AccountEx {

	public static void main(String[] args) throws IOException {
		Account account = new Account();
		
		//예금하기
		account.deposit(10000);
		
		log.info("예금액 : " + account.getBalance());
		
		//출금하기
		try {
			account.withdraw(30000);
		} catch(BalanceInsufficientException e) {
			e.printStackTrace();			
			
			String message = e.getMessage();
			log.info(message);
			
			throw new IOException(e);	//오리지널 예외객체인 e를 IOException 생성자의 매개변수로 넣음 >> IOException 을 Wrapper객체로 만든다.
		} //try-catch
		
	} //main
	
} //end class

오리지널 예외객체인 BalanceInsufficientException e 를
IOExeption 생성자의 매개변수로 넣어줌 >> Wrapping한다!
throw로 예외객체 발생시켰기 때문에, main메소드 시그니처 옆에 throws절 필요.

stack tace를 보면, Caused by <<절 있는데,
original 예외객체 때문에 Wrapper예외 발생했음을 표시해준다.

이 wrapping은 중첩해서 사용할 수 있음!
Wrapping한 횟수만큼 스택트레이스에 Caused by 가 표시됨.

좋은 웹페이지 즐겨찾기