BE/JAVA

[JAVA] 예외 처리 ( Exception, Throws, 커스텀 Exception )

지금해냥 2025. 6. 7. 15:31

Exception

- 프로그램 실행 중 예기치 못한 사건을 예외라고 하는데, 예외 상황을 미리 예측하고 처리하는 방식을 예외처리라고 함.

 

try - catch - finally 구문

- 자바스크립트에서도 동일한 방식으로 예외처리를 할 수 있음

try {
    // 수행할 코드
    // 예외 발생 가능성이 있는 블록
} catch (예외 클래스 변수명) {
	// 예외 처리 블록
} finally {
	// 예외 발생 여부와 상관없이 반드시 실행되는 블록
}

try

- 예기치 못한 사건이 발생할 수 있는 구문

catch

- 예기치 못한 사건이 발생했을 때 동작하는 구문

finally

- 사건이 발생하든 발생하지 않든 동작하는 구문

 

예시 코드

public class excceptionExam {
    public static void main(String[] args) {
        int i = 10;
        int j = 0;
        try {
            int k = i/j;
            System.out.println(k);
        } catch (ArithmeticException e){
            System.out.println("0으로 나눌 수 없습니다." + e.toString());
        } finally {
            System.out.println("계산 종료");
        }
    }
}

- 에러가 발생하지 않는 경우

- 에러가 발생한 경우

- 코드에서 보다시피 분모가 0으로 나눴을 때 이후, 즉 에러가 발생한 부분 이후는 출력되지 않고 catch 구문이 동작함.

- finally 구문은 에러 발생 여부와 상관없이 동작

- catch 구문에서는 예상할 수 있는 에러의 타입을 명확하게 명시해야 제대로 동작함.

 

Throws

- 메소드에서 예외가 발생했을 때, 예외를 호출한 쪽에서 예외를 사용할  수 있도록 전달하는 역할

public class ExceptionExam2 {
    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try {
            int k = divide(a, b);
            System.out.println(k);
        } catch (ArithmeticException e){
            System.out.println("0으로 나눌수 없습니다.");
        } catch (IllegalArgumentException e){
            System.out.println(e);
        }
    }

    public static int divide(int a, int b) throws ArithmeticException, IllegalArgumentException {
        int k = a/b;
        return k;
    }
}

- 메소드 옆에 throws를 이용해서 전달 할 수 있는 예외를 명시해서 메소드를 호출한 쪽에서 처리하도록 만들 수 있음.

 

Exception 발생 시키기 ( 강제 에러 처리 )

- 강제로 오류를 발생시켜서 예외를 전달하도록 만듬

public class ExceptionExam2 {
    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try {
            int k = divide(a, b);
            System.out.println(k);
        } catch (ArithmeticException e){
            System.out.println("0으로 나눌수 없습니다.");
        } catch (IllegalArgumentException e){
            System.out.println(e);
        }
    }

    public static int divide(int a, int b) throws ArithmeticException, IllegalArgumentException {
        if (b == 0) {
            throw new IllegalArgumentException("분모가 0일 수 없습니다.");
        }

        int k = a/b;
        return k;
    }
}

- throws 와 동일한 메소드에 throw 를 통해서 exception을 생성하여 전달함.

- 자바스크립트에서도 비슷한 방식으로 에러 전달 가능

throw new Error();

 - 메소드가 예상하지 못한 방식으로 동작 할 수 있기 때문에 특정 조건일 때 예외를 발생시켜서 제어할 수 있음.

 

커스텀 Exception

  • Checked Exception을 사용하고 싶은 경우 Exception을 상속
    • 반드시 오류를 처리해야 하는 Exception
    • 예외 처리를 하지 않으면 컴파일 오류 발생
  • Unchecked Exception을 사용하고 싶은 경우 RuntimeException을 상속
    • 예외 처리를 하지 않아도 컴파일 시에 오류를 발생시키지 않음.

 

// BizException.java
public class BizException extends RuntimeException {
    public BizException(String msg){
        super(msg);
    }

    public BizException(Exception ex){
        super(ex);
    }
}

- Exception을 상속받아서 커스텀 Exception을 만들 수 있음.

- 생성자의 매개변수를 super로 부모의 생성자로 전달하여 사용함

// BizService.java
public class BizService {
    public void bizMethod(int i) throws BizException{
        System.out.println("비즈니스 메소드 시작");

        if (i < 0){
            throw new BizException("0보다 작습니다.");
        }

        System.out.println("비즈니스 메소드 끝");
    }
}

- 커스텀 Exception을 전달하는 메소드 생성

// BizExam.java
public class BizExam {
    public static void main(String[] args) {
        BizService biz = new BizService();

        try {
            biz.bizMethod(5);
            biz.bizMethod(-3);
        } catch (BizException e) {
            System.out.println(e.getMessage());
        }
    }
}

- 커스텀 Exception을 사용하는 메소드를 호출하여 사용

- 매개변수로 5를 전달 받은 메소드는 정상적으로 동작

- 매개변수로 -3을 전달 받은 메소드는 throw를 통해 에러를 전달받아서 동작하는 것을 확인 할 수 있음.

LIST