본문 바로가기

잡다한 개발잡담

중첩된 Try catch block 작동 방식

예외처리를 생각하던 중 Try ~ catch문을 중첩해서 사용하는게 올바른 것이고? 중첩된 방식이 어떠한 구조로

작동하는지 헷갈려서 공부해봤습니다.

중첩된 try ~ ctach문

public static void main(String[] args) {

        try {
            System.out.println("main try - catch");
            try {

                System.out.println("second try - catch ");

                try {

                    System.out.println(" third try - catch ");

                }
            } catch(Exception e2) {
             // Exception
            }

        } catch(Exception e3) {
            // Exception
        }

    }

위에 3개의 try catch문이 있습니다. main try catch문 아래에 second, second 아래에 third가 있네요.

쉽게 생각하기 위해 main의 자식이 second이고 second의 자식이 third라고 생각하겠습니다. 즉 third에게 main은 grand

parent 관계라고 할 수 있습니다.

그렇다면 third에서 일어난 예외처리를 어디서 진행할까요? 위 예제에서는 third의 try문에는 catch가 없습니다.

아래 예제를 통해 알아보겠습니다.

예제 1

public static void main(String[] args) {

        try {
            try {
                try {

                    int[] arr = new int[10];
                    arr[11] = 5;
                    System.out.println(" third try - catch ");

                } catch(ArithmeticException e3){
                    // ArithmeticException Exception
                    System.out.println("third catch exception");
                }
            } catch(ArrayIndexOutOfBoundsException e2) {
             // ArrayIndexOutOfBoundsException
                e2.printStackTrace();
                System.out.println("second catch exception");
            }

        } catch(Exception e3) {
            // Exception
            System.out.println("main catch exception");
        }

    }

 

third try catch에서 일어난 ArrayIndexOutOfBoundsException을 exeception handling하지 못한다면 그 부모의 catch절

에서 에러를 핸들링하게 됩니다.

그래서 실행하게 되면 위와 같은 결과를 볼 수 있습니다. 

예제 2

public static void main(String[] args) {

        try {
            try {
                try {

                    int a = 5 / 0;
                    System.out.println(" third try - catch ");
                } finally {

                }

            } catch(ArrayIndexOutOfBoundsException e2) {
                // ArrayIndexOutOfBoundsException
                e2.printStackTrace();
                System.out.println("second catch exception");
            }

        } catch(Exception e) {
            // Exception
            e.printStackTrace();
            System.out.println("main catch exception");
        }

    }

 

위와 같은 예제는 어디서 예외를 처리할까요?

third에서는 예외를 핸들링하는 catch문이 존재하지 않고, second는 ArithmeticException을 처리할 수 있는 catch문이 없

는걸 확인할 수 있습니다. 그러므로 마지막 main의 catch문에서 예외를 핸들링할 수 있습니다.

이게 기본적인 중첩 try catch문의 작동방식입니다.

 

저 역시 공부를 하면서 글을 작성하는 것이기 때문에 틀린점이 있을 수 있습니다! 

댓글로 알려주시면 수정하도록 하겠습니다. 감사합니다!