📌 자바 예외처리 방법과 종류
java exception handling (Checked Exception, Unchecked Exception)
0️⃣ 예외와 에러의 의미
예외(Exception)란 입력 값에 대한 처리가 불가능하거나, 프로그램 실행 중에 참조된 값이 잘못된 경우 등 정상적인 프로그램의 흐름을 어긋나는 것을 말한다. 또한, 자바에서의 예외는 개발자가 직접 처리할 수 있기 때문에 예외 상황을 미리 예측하여 다룰 수 있다.
에러(Error)는 시스템에 비정상적인 상황이 발생한 경우를 말한다. 주로 자바 가상 머신(JVM)을 통해 발생되며 예외와 반대로 이를 애플리케이션 코드에서 잡으려고 하면 안 된다.
package src.throwable.error;
public class ErrorExample {
public static void gillog(String log) {
System.out.println(log);
}
public static void main(String[] args) {
try {
gillog("Error Test");
} catch (StackOverflowError e) {
// ......... :(
}
}
}
에러의 경우 StackOverflowError에 대해 Catch를 하려 해도 처리할 수 없다.
1️⃣ 예외(Exception)의 구분
RuntimeException을 상속하지 않는 클래스는 Checked Exception로 분류할 수 있고,
RuntimeException을 상속하는 클래스는 Unchecked Exception으로 분류할 수 있다.
2️⃣ 에러(Error)의 종류
에러의 종류에는 LinkageError, ThreadDeath, AssertionError, VirtualMachineError가 있다.
종류 | 설명 |
LinkageError | 어떤 클래스가 다른 클래스에 대한 종속성이 있는 상황에서, 후자 클래스가 이전 클래스를 컴파일 한 후 비호환적으로 변경된 경우 발생하는 Error이다. |
ThreadDeath | 더 이상 사용되지 않는 Thread에 대해 Thread.stop() method가 호출 될 때, 삭제되는 Thread에서 Instance가 throw 되며 발생하는 Error이다. |
AssertionError | Assertion이 실패한 경우 발생하는 Error이다. Assertion : 해당 지점에서 개발자가 반드시 참(true)이어야 한다고 생각하는 사항을 표현한 논리식 _[EX] assert [boolean]; assert [boolean] : [표현식]; |
VirtualMachineError | JVM이 손상되었거나 계속 작동하는 데 필요한 리소스가 부족할때 발생하는 Error |
3️⃣ CheckedException과 UncheckedException
💡 CheckedException
◽ CheckedException은 반드시 예외 처리해야 하며, 컴파일 시점에서 예외 발생이 확인된다.
◽ CheckedException은 Error와 RuntimeException을 상속하지 않은 예외들을 모두 포함한다.
◽ Error, FileNotFoundException, ClassNotFoundException 등이 대표적이다.
◽ 스프링 프레임워크에서 CheckedException은 트랜젝션 처리 시에 예외가 발생해도 롤백하지 않는다.
💡 UncheckedException
◽ UncheckedException은 명시적으로 예외 처리할 필요가 없으며, 런타임 시점에서 예외 발생이 확인된다.
◽ UncheckedException은 RuntimeException을 상속받는 예외들을 포함한다.
◽ NullPointerException, ClassCastException 등이 대표적이다.
◽ 스프링 프레임워크에서 UncheckedException은 트랜젝션 처리시에 예외가 발생한 경우 롤백을 수행한다.
💥 순수 자바 관점에서의 UncheckedException 상황에서는 롤백을 수행하지 않아도 된다.(스프링과 다름)
참고 영상 : https://www.youtube.com/watch?v=_WkMhytqoCc
4️⃣ 예외처리 방법
예외 처리 방법에는 복구, 회피, 전환 이 있다.
🏳🌈 예외 복구
- 예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 방법
- 예외를 잡아서 일정 시간, 조건만큼 대기하고 다시 재시도를 반복한다.
- 최대 재시도 횟수를 넘기게 되는 경우 예외를 발생시킨다.
final int MAX_RETRY = 100;
public Object someMethod() {
int maxRetry = MAX_RETRY;
while(maxRetry > 0) {
try {
...
} catch(SomeException e) {
// 로그 출력. 정해진 시간만큼 대기한다.
} finally {
// 리소스 반납 및 정리 작업
}
}
// 최대 재시도 횟수를 넘기면 직접 예외를 발생시킨다.
throw new RetryFailedException();
}
🏳🌈 예외처리 회피
- 예외 처리를 직접 담당하지 않고 호출한 쪽으로 던져 회피하는 방법
- 그래도 예외 처리의 필요성이 있다면 어느 정도는 처리하고 던지는 것이 좋다.
- 긴밀하게 역할을 분담하고 있는 관계가 아니라면 예외를 그냥 던지는 것은 무책임하다.
// 예시 1
public void add() throws SQLException {
// ...생략
}
// 예시 2
public void add() throws SQLException {
try {
// ... 생략
} catch(SQLException e) {
// 로그를 출력하고 다시 날린다!
throw e;
}
}
🏳🌈 예외 전환
- 예외 회피와 비슷하게 메서드 밖으로 예외를 던지지만, 그냥 던지지 않고 적절한 예외로 전환해서 넘기는 방법
- 조금 더 명확한 의미로 전달되기 위해 적합한 의미를 가진 예외로 변경한다.
- 예외 처리를 단순하게 만들기 위해 포장(wrap) 할 수도 있다.
// 조금 더 명확한 예외로 던진다.
public void add(User user) throws DuplicateUserIdException, SQLException {
try {
// ...생략
} catch(SQLException e) {
if(e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY) {
throw DuplicateUserIdException();
}
else throw e;
}
}
// 예외를 단순하게 포장한다.
public void someMethod() {
try {
// ...생략
}
catch(NamingException ne) {
throw new EJBException(ne);
}
catch(SQLException se) {
throw new EJBException(se);
}
catch(RemoteException re) {
throw new EJBException(re);
}
}
📌 참고사이트
https://madplay.github.io/post/java-checked-unchecked-exceptions
'Backend > Java (Spring)' 카테고리의 다른 글
[Java] 자바 옵셔널(Java Optional)이란? (0) | 2022.07.18 |
---|---|
[MyBatis] 마이바티스 동적 쿼리 작성하기 (0) | 2022.06.15 |
[Spring] Model 객체 (Model, ModelMap, ModelAndView)에 대해서 (0) | 2022.03.21 |
[SPRING] ava.lang.IllegalArgumentException: AJP 연결자는 secretRequired="true"로 구성되었으나 보안 속성이 널 또는 ""입니다. (0) | 2022.03.04 |
[Spring] 스프링 jsp에 css, js 적용하기 (0) | 2022.01.12 |
최근댓글