[CS공부] JAVA(1)-예외 처리(Exception Handling)

Min Kim·2023년 2월 4일
0

CS 공부

목록 보기
1/15

1. 예외 처리란?


자바를 사용하면서 다양한 코딩 실수들로 인한 오류가 생길 수 있습니다. 이를 예외(exception)이라고 하죠!
예외가 발생하면 보통의 프로그램들은 종료가 되거나 프로그램이 중단됩니다. 하지만 이러한 오류들로 종료되지않고 정상 작동하게 하는 것을 예외 처리라고 합니다.

예외와 오류의 차이
예외는 개발자가 개발 단계에서 예측가능해 방지할 수 있는 문제들 혹은 해결 가능한 문제
오류는 이후 발견되는 예측 못한 심각한 문제들

2. 예외 처리 종류


예외 처리는 크게 두 종류로 나뉩니다.
바로 Checked ExceptionUnchecked Exception이 있습니다.
둘의 특징은 다음과 같습니다.

Checked ExcpetionUnchecked Exception
처리여부반드시 예외처리!명시적인 처리를 강요하진 않음
확인시점컴파일 단계실행 단계
예외발생시
트랜잭션 처리
roll-back Xroll-back O
대표 예외Exeption의 상속 받는 하위 클래스 중
Runtime Exeption을 제외한 모든 예외
ex) IOExeption, SQLExeption
Runtime Exeption 하위 예외
ex) NullPointException, IllegalArgumentException,

간단한 용어 정리

  • 트랜잭션 : 작업 단위라는 뜻입니다. 위에서는 하나의 기능을 위한 업무 단위를 이야기 합니다.
  • Roll-back : 이전 상태로 돌아가거나 다시 처음으로 돌아가는 것을 말합니다.
  • checked exception : 다른 말로 필수 예외로 개발자가 꼭 예외처리를 해야하는 예외입니다.
    Runtime Exeption 이외의 모든 예외입니다.
  • Uncheked exception : 다른 말로 실행 예외로 개발자가 반드시 처리해야하는 예외는 아닙니다. Runtime exception 클래스의 모든 하위 클래스가 해당됩니다.
    • 클래스 분포도

3. 예외 처리 방법


1) 예외 복구

Exception이 발생하여도 Application은 정상적으로 동작하게 하는 것이 핵심입니다.
다른 비즈니스 로직 흐름으로 유도 시키거나, 예외가 발생하지 않는 상황으로 복구를 시도하는 로직을 추가하는 방식이죠! 주로 네트워크를 연결이나 블루투스 연결과 같이 반복적인 방법으로도 해결할 수 있는 곳에 사용됩니다. 다음 예시를 보시겠습니다.

private void mayThrowExceptionLogic() {
    int maxTry = 20;
    while(maxTry --> 0) {
    	try {
    		// ???Exception 이 Throw 될 수 가능성이 있는 로직
        
        	// 성공 시 return, 해당 메소드 종료
        	return ;
    	} catch(???Exception e) {
    		// Error 로그 출력
                // 실패 로직 존재 시 원상 복구
        	// 일정 시간 동안 대기
    	} finally {
    		// 작업에 사용한 Resource 반환 및 정리
    	}
    }
    // 최대 횟수 실패시 예외 Throw
   

만약 서버 상태에 따라 접속 불안정 등으로 실패 가능성이 있는 로직에,
위 maxTry 만큼 정상 로직을 재시도하여 maxTry가 초과될 경우 또 다른 Exception으로 전환하여 Throw 한다면
maxTry의 시도로 비즈니스 로직이 정상 수행 될 수 있고,
throw new MaxTryFailedException();와 같이 새로운 Exception으로 전환하여 Throw 하지 않더라도,
해당 로직 실패시 다른 수행 로직을 첨가하여 Application의 흐름을 정상적으로 마무리할 수도 있게 됩니다.

2) 예외 회피

이 방법은 간단하게 예외가 발생하면 throws를 통해 다른 메소드로 던져버리고 회피하는 방법입니다. 이는 주의해야 할 점exception을 통해 handling을 하는 것보다 expection을 회피하고 throw하는 것이 더 좋다는 확신이 들 때만 해야 한다는 것입니다.

private void mayThrowExceptionLogic() throws ???Exception {
	// 비즈니스 로직
}

3) 예외 전환

try {
	// Exception 발생 가능 로직
}
catch(???Exception e) {
	// Exception 로깅
    	// 복구 로직
        throw CustomSpecificExceptionJustLikeNotAllowedUserException("이런상황~");
}
}

예외 전환은 특정 예외가 발생하면 새로운 예외로 전환하여 예외를 더욱 분명히해 처리하는 방식 입니다.
checked exception처럼 복구 불가능 예외를 catch하여 unchecked exception으로 전환해 handling함으로써 다른 계층에서 checked exception을 일일이 선언하지 않아도 되게 할 때 많이 사용합니다.

4. 자주 사용하는 예외들

  • ArithmeticException
int num = 5/0;	// divide by 0

불가능한 산수를 진행하면 발생하는 예외입니다. 대표적으로 divide by 0 문제, 즉 정수를 0으로 나누려고 할 때 발생합니다.

  • ArrayIndexOutOfBoundsException
int[] arr = {1,2,3};
System.out.println(arr[3]);	// 배열 범위 벗어남

배열의 범위를 벗어난 index에 접근할 시 발생합니다.

  • FileNotFoundException

파일을 찾을 수 없을 때 발생합니다.

  • NullPointException
String str = null;
System.out.println(str.equals("exception"));	// null

존재하지 않는 레퍼런스를 참조할 때 발생합니다.

참고 사이트


해당 사이트의 내용을 참고로 작성했습니다. 추후에 더 알게 되는 내용들을 추가하겠습니다.

ChanBLOG
코드 연구소
tcpschool
Catsbi's DLog
Dev Day
복세편살 개발라이프
차근차근 개발로그
코딩팩토리
장쫄깃 기술블로그
GilLog

profile
Better & Better 꾸준히 성장하는 개발자

0개의 댓글