ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바의정석 8장 예외처리, 예외던지
    Java/자바의정석 2023. 2. 22. 10:21
    반응형
    package Chap08;
    
    class Ex8_13 {
        public static void main(String args[]) {
            try {
                install();
            } catch(InstallException e) {
                e.printStackTrace();
            } catch(Exception e) {
                e.printStackTrace();
            }
        } // main의 끝
    
        static void install() throws InstallException {
            System.out.println("시작");
            try {
                startInstall();       // 프로그램 설치에 필요한 준비를 한다.
                copyFiles();      // 파일들을 복사한다.
            } catch (SpaceException2 e)    {
                System.out.println("전달받음");
                InstallException ie = new InstallException("설치 중 예외발생111"); ///2
                System.out.println(ie.getMessage());
                ie.initCause(e);
                throw ie;
            } catch (MemoryException2 me) {
                InstallException ie = new InstallException("설치 중 예외발생"); ///3
                ie.initCause(me);
                throw ie;
            }
            // finally -> 마지막에 반드시 실행시켜야 하는 코드
            finally {
                deleteTempFiles();    // 프로그램 설치에 사용된 임시파일들을 삭제한다.
            } // try의 끝
        }
    
        static void startInstall() throws SpaceException2, MemoryException2 {
            System.out.println("start메소드");
            if(!enoughSpace()) {      // 충분한 설치 공간이 없으면...
                throw new SpaceException2("설치할 공간이 부족합니다."); ///1
            }
    
            if (!enoughMemory()) { // 충분한 메모리가 없으면...
                throw new MemoryException2("메모리가 부족합니다.");
    //       throw new RuntimeException(new MemoryException("메모리가 부족합니다."));
            }
        } // startInstall메서드의 끝
    
        static void copyFiles()       { /* 파일들을 복사하는 코드를 적는다.   */ }
        static void deleteTempFiles() {
            System.out.println("종료");
        }
    
        static boolean enoughSpace() {
            // 설치하는데 필요한 공간이 있는지 확인하는 코드를 적는다.
            return false;
        }
        static boolean enoughMemory() {
            // 설치하는데 필요한 메모리공간이 있는지 확인하는 코드를 적는다.
            return true;
        }
    } // ExceptionTest클래스의 끝
    
    class InstallException extends Exception {
        InstallException(String msg) {
            super(msg);
        }
    }
    
    class SpaceException2 extends Exception {
        SpaceException2(String msg) {
            super(msg);
            System.out.println("예외 메시지 전달");
        }
    }
    
    class MemoryException2 extends Exception {
        MemoryException2(String msg) {
            super(msg);
        }
    }

    ==============실행결과================

    시작
    start메소드
    예외 메시지 전달
    전달받음
    설치 중 예외발생111
    종료
    Chap08.InstallException: 설치 중 예외발생111
    at Chap08.Ex8_13.install(Ex8_13.java:21)
    at Chap08.Ex8_13.main(Ex8_13.java:6)
    Caused by: Chap08.SpaceException2: 설치할 공간이 부족합니다.
    at Chap08.Ex8_13.startInstall(Ex8_13.java:39)
    at Chap08.Ex8_13.install(Ex8_13.java:17)
    ... 1 more


    예외 발생시키기 - throw

    프로그램적으로 에러가 아님에도 코드의 로직상 개발자가 고의로 에러를 발생시켜 로그에 기록하고 싶은 경우가 올 수 있다. 이때 자바에서는 throw 키워드를 사용하여 강제로 예외를 발생시킬 수 있다.

    기존의 경우는 프로그램이 자동적으로 에러를 인지하고 처리하였지만, 이런 경우에는 개발자가 고의로 throw를 사용하여 에러를 발생시키고, 이 에러를 다시 catch한다고 생각하면된다.

     

    이런경우에 new 생성자로 예외 클래스를 초기화하여 던지는데, 이 예외 클래스 생성자에 원하는 입력값을 주게되면, catch문의 getMessage() 메서드에서 지정한 값을 출력할 메세지로 지정이 가능하다.

     

     

    예외 떠넘기기 (throws)

    평균적으로 예외가 발생할 가능성이 있는곳에 try-catch를 사용하여 예외를 처리하지만, 경우에 따라서 다른 곳에 예외를 몰아넣어 한번에 처리하거나 혹은 특정 예외를 처리하도록 호출한 곳으로 예외를 떠넘길 수도 있다.

    이런경우 사용하는 키워드가 throws이다. throws  메서드 선언부 끝에 작성하며 메서드에서 예외를 직접 처리(catch)하지 않은 예외를 호출한 곳으로 넘겨버리는 기능을 한다.

    Point

    예외를 발생시키는 경우 throw를 사용 , 예외를 메서드에 선언하는 경우 throws를 사용.

     

     

    이제 코드를 다시 본다면

        static void startInstall() throws SpaceException2, MemoryException2 {
            System.out.println("start메소드");
            if(!enoughSpace()) {      // 충분한 설치 공간이 없으면...
                throw new SpaceException2("설치할 공간이 부족합니다."); ///1
            }
    
            if (!enoughMemory()) { // 충분한 메모리가 없으면...
                throw new MemoryException2("메모리가 부족합니다.");
    //       throw new RuntimeException(new MemoryException("메모리가 부족합니다."));
            }
        } // startInstall메서드의 끝

    main의 try문에서 실행된  install() -> startInstall()메서드가 실행된다.

    startinstall()메서드에서는 enoughSpace()와 enoughMemoery()메서드를 호출하며

    static boolean enoughSpace() {
        // 설치하는데 필요한 공간이 있는지 확인하는 코드를 적는다.
        return false;
    }
    static boolean enoughMemory() {
        // 설치하는데 필요한 메모리공간이 있는지 확인하는 코드를 적는다.
        return true;
    }

    해당코드는 이와같다. enoughSpace는 false를 반환

    if(!enoughSpace()) {       // 충분한 설치 공간이 없으면...
        throw new SpaceException2("설치할 공간이 부족합니다."); ///1
    }

    해당 코드가 실행되며 여기서 SpaceException2라는 예외를 생성하여 고의로 예외를 발생시킨다.

    static void startInstall() throws SpaceException2, MemoryException2

    고의로 발생시킨 예외를 처리하기위해 throws SpaceException2를 사용하였고

    class SpaceException2 extends Exception {
        SpaceException2(String msg) {
            super(msg);
            System.out.println("예외 메시지 전달");
        }
    }

    super(msg)에서 설치할공간이 부족합니다. 라는 메시지를 전달받고.

     

    static void install() throws InstallException {
        System.out.println("시작");
        try {
            startInstall();       // 프로그램 설치에 필요한 준비를 한다.
            copyFiles();      // 파일들을 복사한다.
        } catch (SpaceException2 e)    {
            System.out.println("전달받음");
            InstallException ie = new InstallException("설치 중 예외발생111"); ///2
            System.out.println(ie.getMessage());
            ie.initCause(e);
            throw ie;
        } catch (MemoryException2 me) {
            InstallException ie = new InstallException("설치 중 예외발생"); ///3
            ie.initCause(me);
            throw ie;
        }
        // finally -> 마지막에 반드시 실행시켜야 하는 코드
        finally {
            deleteTempFiles();    // 프로그램 설치에 사용된 임시파일들을 삭제한다.
        } // try의 끝
    }

     

     

     

     catch (SpaceException2 e)  {

    해당 예외를 처리할수있는 catch문으로 이동

    InstallException ie = new InstallException("설치 중 예외발생111"); ///2

    해당 예외를 다시 초기화하고  '설치 중 예외발생111' 이라는 메시지를 입력받고

    이 해당 메시지를 getMessage()메서드를 통해 호출한다.

    그리고 참조변수를 통해 initCause(e) 예외의 원인으로 설정한뒤

    다시 throw ie를 사용하여 예외를 던지지만

    } catch (MemoryException2 me) {
        InstallException ie = new InstallException("설치 중 예외발생"); ///3
        ie.initCause(me);
        throw ie;
    }

    다음 catch 블럭에서는 타입이 일치하지않아 catch문이 실행되지않는다.

    //  finally -> 마지막에 반드시 실행시켜야 하는 코드
    finally {
        deleteTempFiles();    // 프로그램 설치에 사용된 임시파일들을 삭제한다.
    } // try의 끝
    static void deleteTempFiles() {
        System.out.println("종료");
    }

    그리곤 finally를 사용하여 deleteTempFiles메서드를 호출하며 해당 코드가 모두 종료된다.

    반응형

    댓글

Designed by Tistory.