개요

자바 언어를 사용하여 프로그래밍을 하다보면 런타임 에러같은 예상하지 못한 에러가 생기거나, 배열의 개수를 잘못 처리하여 예외처리가 생기는 경우들이 있습니다. 

예외의 경우 예외처리를 위해 try - catch 블록을 사용하여 예외처리를 한거나, throw등을 사용하여 예외 처리를 하였습니다. 그중 예외처리를 하는 방법은 3가지의 기법이 있으며 그에 관한 회피,복구,전환에 대하여 알아보겠습니다.

 

※에러(Error) : 에러는 자바 프로그램 밖에서 발생한 오류입니다. 프로그램이 동작하는 서버 자체에서 고장이 나거나, 

OS에서 문제가 생긴경우 등이있으며, 자바에서는 OutOfMemoryError, ThreadDeath등이 있습니다. 이러한 에러들은 catch 블록으로 해결 할 수 없습니다.

 

※예외(Exception) : 예외는 개발자가 프로그래밍시 실수로 인해 발생하는 프로그램 오류입니다. 예외의 경우에는 예외처리 코드를 사용하여 프로그램을 정상적으로 실행할 수 있습니다.

 

 

예외의 종류

출처-https://velog.io/@penrose_15/%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC

자바에서 모든 예외는 java.lang.Exception 클래스를 상속받습니다.

모든 예외가 Exception클래스를 상속 받는다는건, 개발자들이 만든 코드에서 예외 상황이 발생하였을 때 사용하는 모든 예외처리들은 전부 Exception클래스를 사용하여 사용할 수있습니다.

예외의 경우에는 체크 예외(Checked Exception)와 언체크예외(Unchecked Exception, Runtime Exception)으로 분류 할 수있습니다.

 

Checked Exception

체크예외는 예상하지 못했던 예외상황에서 발생하는 것들을 말합니다.

체크 예외가 발생할 수 있는 메서드를 사용할 경우, 반드시 try-catch 혹은, throws를 명시적으로 정의해야 컴파일 에러가 발생하지 않습니다.

Checked Exception의 경우 대표적으로 IOException, SQLException등이 있으며, 예외적인 상황에서 던져질 가능성이 있는 대부분이 체크 예외로 만들어져 있습니다.

 

Unchecked Exception

RuntimeException클래스를 상속한 예외들은 명시적인 예외처리를 강제하지 않기 때문에 언체크 예외/런타임 예외 라고 불립니다.

에러와 마찬가지로 try-catch, thorws를 사용하지 않아도되며, 명시적 thorws로 선언해도 문제 없습니다.

에러와 비슷하지만 언체크 예외라고 불리는 이유는 개발자의 부주의로 인하여 발생할수있는 경우에 발생하도록 만든 것들이라는 차이가 있습니다. 즉, 언체크 예외는 프로그램의 오류가 있을 시 발생하도록 의도적으로 만든 것들입니다.

대표적으로 할당하지않은 레퍼런스 변수를 사용할려 할때 발생하는NullPointerException,허용되지 않는 값을 사용하여 메서드를 호출할 때 발생하는 IllegalArgumentException 등이 있습니다.

 

예외상황에서 발생하는 2가지 종류 CheckedException, UncheckedException에 대하여 차이점을 알아보았습니다.

체크 예외의 경우 예상하지 못했던 예외상황에서 발생하는 경우를 말하며 명시적으로 try-catch / thows등을 사용하여 예외 처리를 해야합니다.

언체크 예외는 개발자의 실수로 인하여 오류가 생길시 명시적으로 예외 처리를 하지 않아도 의도적으로 예외처리를 하는 차이가 있습니다.

예외의 두가지 종류에 대한 차이도 알아보았으니 예외처리를 하는 세가지의 기법에 대해 알아보겠습니다.

 

Exception Handling

1. 예외 복구(Recovery)

예외 복구란, 예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 기법을 말합니다.

예외가 발생하더라도 프로그램이 멈추지 않고 계속 실행 할 수 있도록 복구작업을 수행하는 경우가 예외 복구에 속합니다.

        while (maxretry > 0) {
            try {
                // ...          // 예외가 발생할 가능성이 있는 시도
                return;         // 작업이 성공시에 반복문을 종료한다.
            }catch(SomeException e) {
                // 해당 예외에 맞는 로그 출력 :: 정해진 시간만큼 대기
            }
            finally {
                // 리소스 반납. 정리 작업
            }
            maxretry--;
        }
        throw new RetryFailedException();   //최대 재시도 횟수를 넘기면 직접 예외 발생

예외 복구에 대한 예시로는 네트워크가 불안정해 접속이 안되었을 경우, 일정시간 대기했다가 다시 접속을 시도하는 방법들이 있습니다. 반복문을 통하여 재시도할 횟수를 정의 할 수도 있습니다.

 

 

2.예외 회피(Avoidance)

예외 회피란 자신이 담당하지 않고 자신을 호출한 쪽으로 예외를 던져버리는 것입니다.

throws 문으로 선언하여 예외가 발생하면 알아서 던져지게 하거나, catch문으로 예외를 처리 후 로그를 출력하며 다시 예외를 던지는 것(rethorw)을 말합니다.

    public void avoidException() throws SQLException   
    {
        try{
            // ...                      // 예외가 발생할 가능성이 있는 시도
        } catch(SQLException e)
        {
            e.printStackTrace();        // 로그 출력
            throw e;                    // 다시 날린다.
        }
    }

 

3. 예외 전환 (Translation)

예외 전환은 복구할수 없는 경우 메서드 밖으로 던지는 회피와 비슷하지만, 예외를 그대로 넘기는게 아니라 적절한 예외로 전환하여 던지는 것을 말합니다.

예회 전환을 하는 경우에는 두가지가 있습니다.

1. 내부에서 발생한 예외를 그대로 던지는 것 보다 의미를 분명하게 해줄 수 있는 예외로 바꿔주기 위해 사용합니다.

2. 예외를 처리하기 쉽고 단순하게 만들기위해 포장(wrap)하는 것이 있습니다. 주로 예외처리를 강제하는 체크 예외를 언체크 예외인 런타임 예외로 바꾸는 경우에 사용합니다.

    public void transException() throws DuplicateUserIdException, SQLException{
        try {
            // ...          // throws 선언한 예외에 관한 코드   
            // ...      
        }catch(SQLException e)
        {
            // ErrorCode가 MySQL의 "Duplicate Entry(1062)이면 예외 전환
            if(e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY)
            {
                throw DuplicateUserIdException();
            }else {
                throw e;        // 그 외의 경우에는 SQLException 그대로.
            }
        }
    }

 

- 조금 더 명확한 의미를 전달하기위해 의미를 분명하게 해줄 수 있는 예외로 바꿔주는 경우

 

try {
            // ...
        } catch (NamingException ne)        
        {
            throw new EJBException(ne);
        } catch (SQLException se)
        {
            throw new EJBException(se);
        } catch (RemoteException re)
        {
            throw new EJBException(re);
        }

- 상세한 예외 (ne,se,re)들이 발생하여도 상위 클래스인 EJBException으로 포장해서 던지는 경우.

 

 

 

정리

에러와 예외의 차이점

  • 에러 : 자바 외부(OS, 서버 등)에서 발생하는 오류, try-catch 블록 등으로 해결할 수 없다. 
  • 예외 : 자바에서 개발자의 실수로 발생하는 경우이며, 예외 처리를 통하여 프로그램을 계속 실행할 수 있다.

Java.lang.Exception 클래스의 예외처리 2종류

  • Checked Exception : 메서드에서 예외가 발생할 경우 예외처리를 명시적으로 해야하는 경우.
  • Unchecked Excpetion : try-catch 블록 등을 사용하여 명시적으로 예외처리를 하지 않아도 프로그램 오류가 있을시 예외처리가 발생하도록 만들어둔 경우.

예외처리의 3가지 기법

  • 복구 : 예외가 발생시 문제를 해결하여 프로그램을 멈추지 않고 계속 실행할수 있게 하는 기법.
  • 회피 : 예외가 발생시 문제를 자신이 아닌 다른곳으로 던지는 기법.
  • 전환 : 예외가 발생시 다른곳으로 던지지만, 상황에 맞는 적절한 예외로 전환하여 던지는 기법.

느낀점

이번 포스팅에서 에러와 예외의 차이점과 자바언어의 Exception클래스의 Exception, Runtime Exception에 대한 차이점,

그리고 예외를 처리하는 기법 3가지에 대해 알아보았습니다.

예외를 catch 혹은 throws하여 예외를 회피하는 경우를  자주 사용하였었는데, 예외 복구를 하거나 예외 전환을 하는 방법,그리고 그 차이점들을 파악할 수 있는 학습이 되었습니다.

자바 언어에서 프로그래밍시 예외가 자주 발생하는데, 그에맞게 전환을 할 경우 포장을 할지, 상세적인 내용을 보낼지 등을 이론적으로 알수 있었습니다.

 

참고내역

 https://jhyonhyon.tistory.com/66

토비의 스프링 3.1 - 4장

'Java' 카테고리의 다른 글

Java8과 Java11  (0) 2023.07.26
JVM - Runtime Data Area  (0) 2023.07.06

+ Recent posts