BackEnd/Java

[Java] Exception 기초

샤아이인 2022. 2. 23.

 

2종류의 Exception

Unchecked Exception – RuntimeException을 상속

  • Runtime Time Exception 이라고도 부른다.
  • Exception이 발생하는 메소드에서 throws 키워드를 추가하거나, try-catch로 Exception을 처리할 필요가 없다.
  • Exception을 처리해 줘도 상관은 없다.
  • 컴파일 시점에 Exception을 catch하는지 확인하지 않는다. 컴파일 시점에 Exception이 발생할 것인지의 여부를 판단할 수 없다.

 

Checked Exception과 Unchecked Exception 선택 방법

  • 호출하는 메소드가 Exception을 활용해 무엇인가 의미 있는 작업을 할 수 있다면 Checked Exception을 사용하라.
  • 만약 호출하는 메소드가 Exception을 catch해 예외 상황을 해결하거나 문제를 해결할 수 없다면 Unchecked Exception을 사용하라.
  • 확실하지 않다면 일단 Unchecked Exception을 사용하자!

(추가로, Error 는 애플리케이션이 정상적으로 동작하는데 심각한 문제가 있는 경우를 의미한다, 개발자가 코드로 해결할수가 없다)

 

추가적으로 Exception은 다음과 같이 여러 Exception을 던지는 메서드 라는것을 명시할 수 있다.

public void build() throws ObjectStreamException, UnknownHostException {
}

Exception들은 쉼표로 구분하여 추가해주면 된다.

 

이를 catch하는 부분은 다음과 같다.

public class ExceptionTest {    

    public void exceptionText() {
        try {
            new MyTest().build()
        } catch (ObjectStreamException e) {
            // ObjectStreamException 예외를 처리하는 부분
        } catch (UnknownHostException e) {
            // UnknownHostException 예외를 처리하는 부분
        }
    }
}

만약 각 Exception을 각각 처리하고 싶은 것 이 아니라면, 다음과 같이 | 연산자를 사용하여 catch 할 수 있다.

public class ExceptionTest {    

    public void exceptionText() {
        try {
            new MyTest().build()
        } catch (ObjectStreamException | UnknownHostException e) {
            // 예외를 처리하는 부분
        }
    }
}

 

만약 catch 부분에서 Exception의 메시지 만을 보여 준 후, 다시 예외를 build 메서드를 호출한 Client 에게 전달하고 싶다면 다음과 같이 예외를 재전달(rethrow) 하면 된다.

public class ExceptionTest {    

    public void exceptionText() {
        try {
            new MyTest().build()
        } catch (ObjectStreamException | UnknownHostException e) {
            // 예외를 출력하는 부분
            throw e;
        }
    }
}

 

 

예외가 발생할 경우 예외가 발생한 원인을 찾기 위해 예외의 발생 경로를 추적하는 것이 가능하다.

보통 printStackTrace를 호출하면 된다.

public class ExceptionTest {    

    public void exceptionText() {
        try {
            new MyTest().build()
        } catch (ObjectStreamException | UnknownHostException e) {
            e.printStackTrace()
        }
    }
}

 

finally 키워드를 통해서 예외가 발생하더라도 반드시 실행해야 하는 작업을 처리할 수 있다.

try {
    // Exception이 발생하는 코드
} catch (Exception e) {
    // Exception이 발생하는 경우에 대한 처리
} finally {
    // 무조건 실행되는 부분
}

 

댓글