Programing/Java & Spring

Java 예외(Exception) 처리 이론 정리

세기루민 2022. 10. 19. 12:30
728x90

개요

예외 처리 로직은 귀찮지만 운영상 이슈를 체크할 때 필요한 코드입니다. 

Exception 의 경우 로직 처리를 하지 않더라도 발생은 되지만  RuntimeException은 컴파일 시 발견하지 못하는 에러에

대해 처리가 필요하며 또한 클라이언트에게 오류 메세지를 전달 시 규칙성이 갖춰진 형식으로 전달하는 것이 

조금 더 효율적이다. 

 


예외처리(Exception) 기초

기본적으로 예외처리에는 Error와 Exception으로 나눠지는데  이를 구분할 필요가 있다. 

  • Throwable는 Java 언어의 모든 오류 및 예외의 상위 클래스이며 VirtualMachine에 의해 혹은 throw/catch 절을 통해 발생(Throw) 될 수 있습니다.  
  • Error(오류)의 경우 Exception으로 처리하기 어려울 정도로 심각한 수준의 오류를 말하며 이는 개발자가 생각한 부분에서 발생이 드물며 처리도 어렵기에 예외처리를 고려하지 않아도 된다. 
  • Exception(예외)은  개발자가 구현한 로직에서 예외 사항이 발생했을 때 하는 처리를 말할 수 있다.

 

예외 처리는 Exception 클래스를 상속받아 처리를 진행하며 Exception 클래스에는 IO, File, Runtime Exception을 상속하고

Exception에서는 컴파일 시 발생되는 예외에 대해 처리를 담당한다.

그렇다면 컴파일 외에 발생되는 예외에 대해서는 처리가 어떻게 되는것인가?

그 정답은 RuntimeException에서 처리가 되며 NullPointer, NoSearch 등 runtime에서 발생하는 예외 사항을 처리한다.

RuntimeException은 자주 사용하는 경우는 입력값이나 혹은 로직 상 조건이 부합할 가능성이 있다고 판단되는 부분에 발생할 수 있도록 만든다. 

 

Checked/Unchecked Exception

예외처리는 Checked ExceptionUnchecked Exception으로 나눌 수 있다. 

  • Checked는 Eexception, UnCheked는 Runtime Exception, Error로 구분할 수 있다.
  • Checked Exception은 반드시 예외를 처리해야하지만 Unchecked Exception은 필수로 예외처리가 아닌 명시한 처리에 대해 예외처리가 된다.
  •  Checked Exception의 경우 Try/Catch 문에서 프로세스에 대해 예외사항을 필수로 넣어야 하며 그렇지 않을 경우 컴파일 에러가 발생한다.
  • Unchecked Exception은 컴파일 시점에서는 예외처리를 강제하지  않아 필수로 Try/Catch 할 필요는 없으나 예외 처리가 필요한 경우 예외를 발생(Throw) 시켜야 한다.

 

Exception 처리 방법

Exception 처리 방법으로는 복구, 회픠, 전환 3가지가 있다.

// 복구
public String restore() {
    int maxIter = RETRY;
    while(maxIter --> 0){
        try{
	        ......
        } catch(moreVaildException e){  // 사용자 정의 exception class
    		......
        }
    }
    throw new badRetryException();
}

// 회피 
public String evasion() throws IOException{
	................
}

// 전환 
public String transform() {
	try{
    	...............
    } catch(Exception e){
    	throws SQLException();
    }

}
  • 복구는 예외 발생 시 다른 작업으로 흐름을 유도하는 처리 방법이다.
  • 회피는 예외에 대한 후처리 하지 않고 호출한 쪽으로 예외를 던지는 처리 방법이다.
  • 전환은 명확한 의미 전달을 위해 다른 예외로 전환하여 처리하는 방법이다.

 

Try/Catch

가장 대표적으로 사용하는 예외 처리로는 try/catch를 많이 사용한다. 

try{  // 로직
 ........
} catch(Exception e){ // try에 선언한 내용 중 오류 발생 시 예외 처리 
    e.getMessage();  // 간단하게 에러 원인 출력 
    throw e;
} finally {  // 예외가 발생하더라도 꼭 실행해야 하는 로직 
 .........
}

try/catch를 이용하여 발생된 에러를 잡아내기 위해 사용한다. 

  • try는 예외가 발생할 것 같은 로직을 작성하면 된다. 
  • catch는 try에서 예외가 발생 시 어떻게 예외 처리할 것인지 작성 하면 된다. 
  • finally는 예외처리가 발생되더라도 실행이 필요한 로직을 작성하면 된다. 

즉 Try -> Catch -> Finally 순으로 실행되며, 로직 실행 시 예외가 없다면 Try -> Finally 순으로 실행된다.

Throw 

public Class main{
    public static void main(String[] args){
        try{
            // 방법 1 - 직접 try/catch 문에 exception 설정해주기
            Exception exception = new Exception();
            throw exception
            
            //방법 2 - 다른 매소드에 Exception 생성 후 호출 
            CommonValueNotFound();
            
           
        } catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public static void CommonValueNotFound(){
    	String errMsg = "값 오류";
        throw new BadValueNotFoundException(errMsg);
    }
}

Throw를 이용하여 예외를 발생시킬 수 있다. 

로직 내 연산을 수행하다가 예상치 못한 오류 발생 시 Exception 처리를 도와준다. 

throw 뿐만 아닌 예외처리 사용 방식은 다양하지만 개인적으로 다른 매소드에 호출하여 생성하는것이 좋다. 

실질적으로 개발을 할 때 개발자가 원하는 Exception을 생성 및 관리할 수 있다는 점에서 협업 시 효율적이기 때문이다.


마무리

이번 포스팅을 통해 예외처리에 대해서 한번 더 인지할 수 있었던 기회가 되었습니다. 

다음에는 더 유익한 정보로 찾아오겠습니다.

 

 

기타

예외처리 정리 내용은 주관적인 내용과 기본지식을 정리한 포스팅입니다. 

따라서 내용이 상이하거나 틀릴 수 있는데 그런 부분은 추후에 수정 하도록 하겠습니다. 

 

 

 

 

728x90