티스토리 뷰

★ Exception Handling 이란?

- 작성한 코드가 실행 도중에 어떠한 원인에 의해 오작동하거나 비정상적으로 종료가 되는 경우가 있다.

  이러한 결과를 초래한 원인을 ' 프로그램 오류' 라고 한다.

  오류는 발생시점에 따라 크게 2~3가지로 나눌 수 있다.

 

   1. 컴파일 오류 (Compile-time error)

       소스 코드의 컴파일 과정에서 발생하는 오류

       ex) Syntax Error(문법 오류)

 

   2. 런타임 오류(runtime error)

      문법은 맞았으나, 실행 과정에서 발견(확인)되는 오류

      ex) Shark s = (Shark) new Animal( )

      ex) HTTP 요청 시 "Post" → "POST"

 

   3. 논리적 오류(logical error)

       문법도 맞고,  실행 과정에서의 에러도 없으나 논리가 틀려서 발생하는 오류.

       ex) 사람의 나이가 음수 값으로 설정


자바에서는 실행 시 (runtime) 발생할 수 있는 프로그램 오류를 '에러(error)' 와 '예외(exception)' 로 구분한다.

 

에러(Error) - 시스템 레벨에서 발생, 심각한 문제

일단 발생하면 복구가 어렵다.

ex ) 메모리 부족, 스택 오버 플로 등

 

예외 (Exception) - 개발자의 코드에서 발생, 예방 가능

발생하더라고 수습될 수 있음. 비교적 덜 심각함.

ex) NullPointerException.java → 모든 예외는 클래스 객체임

 

예외 종류

Exception 클래스 : 모든 예외의 최상위 클래스

 

Exception 클래스는 다음과 같이 두 그룹으로 나누는 편.

  1. Exception 클래스와 그 하위 클래스들.
  2. RuntimeException 클래스와 그 하위 클래스들(NullPointer, ClassCast, IndexOutOfBounds..)

RuntimeException을 제외한 일반 Exception 클래스(위에서 1번)들은 주로 외부의 영향으로 발생함.

ex) 해당 프로그램을 사용하는 사용자들의 동작에 의해 존재하지 않는 파일의 이름을 입력, 회원가입 시 잘못된 데이터 입력 등.

 

RuntimeException은 주로 프로그래머의 실수에 의해 발생.

NullPointer, IndexOutOfBounds 등

 

☆ 예외 클래스

예외는 클래스로 관리됨

코드의 실행 도중에 예외가 발생하면 발생한 예외에 대한 설명 및 로그(기록)를 담고 있는 예외 클래스 객체를 생성함.

 

☆ 발생한 예외의 처리 : try - catch

예외 처리(Exception handling)란 프로그램 실행 과정에서 발생할 수 있는 예상치 못한 예외의 발생에 대처가 가능한 코드를 작성하는 것을 의미함.

따라서 프로그램의 비정상적인 종료를 막고, 정상적인 실행을 계속 유지하도록 하기 위함.

try {
	//예외가 발생할 가능성이 보이는 코드를 작성
	Audio a = new Audio();
	Bts b = null;
	a.musicPlay(b); // CD를 재생했는데 음악이 안나오네
} catch (LpEmptyException e1) {	
// Lp에 음악이 하나도 없을 때 처리하기 위한 코드 작성 
} catch (MusicDuplicateException e2) {
	// 같은 음악이 2개 이상 있을 때 처리 코드 작성
} catch (Exception e){
	//위의 예외를 제외한 나머지 모든 예외를 잡고싶을 때
}
}

하나의 try block에는 여러 종류의 예외 처리가 가능하도록 catch block들을 작성할 수 있으며,

만약 이 예외에 해당하지 않는 또 다른 예외를 마주쳤을 경우 예외는 처리되지 않음.

(Kpop Lp를 재생했는데 Jpop이 재생될 경우 등)

 

Tip. if문과는 다르게 try, catch block는 실행 문장이 한 줄이어도 { }를 생략할 수 없음.

 

☆ finally block

finally block이란 try-catch문과 함께 사용되며 예외의 발생 여부에 상관없이 무조건 실행되어야 할 코드를 포함시킬 때 사용됨.

 

try-catch문의 끝에 선택적으로 덧붙여서 사용할 수 있음.

 

try {
	//예외가 발생할 가능성이 있는 코드
} catch(Exception e1){
	// 예외처리를 위한 코드
} finally {
	//예외 발생여부에 관계 없이 항상 수행되어야 하는 코드
}

따라서 finally는 무조건 실행되기 때문에

예외가 발생한 경우에는 'try → catch → finally' 순으로,

예외가 발생하지 않은 경우에는 'try → finally'순으로 실행됨.