KoreanFoodie's Study

10-3. 자바 예외처리 : 사용자 정의 예외, 예외 정보 얻기(getMessage, printStackTrace) 본문

Tutorials/Java

10-3. 자바 예외처리 : 사용자 정의 예외, 예외 정보 얻기(getMessage, printStackTrace)

GoldGiver 2021. 9. 19. 09:49

사용자 정의 예외와 예외 발생

프로그램을 개발하다 보면 자바 표준 API에서 제공하는 예외 클래스만으로는 다양한 종류의 예외를 표현할 수가 없다. 애플리케이션 서비스와 관련된 예외를 애플리케이션 예외 (Application Exception)이라고 한다. 이는 개발자가 직접 정의해서 만들어야 하므로 사용자 정의 예외라고도 한다.

 

사용자 정의 예외 클래스 선언

사용자 정의 예외 클래스는 컴파일러가 체크하는 일반 예외로 선언할 수도 있고, 컴파일러가 체크하지 않는 실행 예외로 선언할 수도 있다. 일반 예외로 선언할 경우 Exception을, 실행 예외로 선언할 경우 RuntimeException을 상속하면 된다.

public class SOME_Exception extends [ Exception | RuntimeException] {
    public SOME_Exception() {}
    public SOME_Exception(String message) { super(message); }
}

사용자 정의 예외 클래스도 필드, 생성자, 메소드 선언들을 포함할 수 있지만 대부분 생성자 선언만을 포함한다. 생성자는 두 개를 선언하는 것이 일반적인데, 하나는 매개 변수가 없는 기본 생성자이고, 다른 하나는 예외 발생 원인(예외 메시지)을 전달하기 위해 String 타입의 매개 변수를 갖는 생성자이다. String 타입의 매개 변수를 갖는 생성자는 상위 클래스의 생성자를 호출하여 예외 메시지를 넘겨준다. 예외 메시지의 용도는 catch { } 블록의 예외 처리 코드에서 이용하기 위해서이다. 

 

예외 발생시키기

사용자 정의 예외 또는 자바 표준 예외를 발생시켜보자.

public void method() throws SOME_Exception {
   throw new SOME_Exception("메시지");
}

그렇기 때문에 throws 키워드를 포함하고 있는 메소드는 호출한 곳에서 다음과 같이 예외 처리를 해주어야 한다.

try {
   method();
} catch(SOME_Exception e) {
    // 예외 처리
}

 

예외 정보 얻기

try 블록에서 예외가 발생되면 예외 객체는 catch 블록의 매개 변수에서 참조하게 되므로 매개 변수를 이용하면 예외 객체의 정보를 알 수 있다. 모든 예외 객체는 Exception 클래스를 상속하기 때문에 Exception이 가지고 있는 메소드들을 모든 예외 객체에서 호출할 수 있다. 그중에서도 가장 많이 사용되는 메소드는 getMessage()와 printStackTrace()이다. 예외를 발생시킬 때 다음과 같이 String 타입의 메시지를 갖는 생성자를 이용하였다면, 메시지는 자동적으로 예외 객체 내부에 저장된다.

} catch(Exception e) {
    // 예외가 가지고 있는 Message 얻기
    String message = e.getMessage();
    
    // 예외의 발생 경로를 추적
    e.printStackTrace();
}

구체적인 예시를 살펴보자.

public class AccountExample {
	
	public static void main(String[] args) {
		AccountExample ex = new AccountExample();
		AccountExample.Account account = ex.new Account();
	
		// 예금하기
		account.deposit(1000);
		System.out.println("예금액: " + account.getBalance());
		
		// 출금하기
		try {
			account.withdraw(30000);
		} catch (BalanceInsufficientException e) {
			String message = e.getMessage();
			System.out.println(message);
			System.out.println();
			e.printStackTrace();
		}
		
	}

	class Account {
		int money;
		
		public Account() {}
		
		void deposit(int m) {
			money += m;
		}
		
		void withdraw(int m) throws BalanceInsufficientException {
			if (money < m)
				throw new BalanceInsufficientException("잔고부족: "+(money-m)+" 모자람");
			money -= m;
		}
		
		int getBalance() {
			return money;
		}
		
	}
	
}

그럼 다음과 같은 결과가 나오는 것을 확인할 수 있다!


해당 포스팅은 이것이 자바다 (신용권 저) 를 참고하였습니다

 

Comments