JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter6

예외 처리는 왜 해야 하나? - 예외처리, 예외클래스, 예외처리미루기

giggs 2022. 1. 19. 12:03

 

예외 처리는 왜 해야 하나? 자바에서 제공되는 클래스들

 

 

프로그램에서의 오류

 

  • 컴파일 오류(compile error)

       프로그램 코드 작성 중 발생하는 문법적 오류

       최근에는 개발 환경(eclipse)에서 대부분의 컴파일 오류는 detection 됨

 

  • 실행 오류(runtime error)

       실행 중인 프로그램이 의도하지 않은 동작(bug)을 하거나 프로그램이 중지되는 오류

       실행 오류는 비정상 종료가 되는 경우 시스템의 심각한 장애를 발생할 수 있음

 

 


 

예외 처리의 중요성

  • 프로그램의 비정상 종료를 피하여 시스템이 원할이 실행되도록 함
  • 실행 오류가 발생한 경우 오류의 과정을 재현하는 것은 현실적으로 힘들다
  • 오류가 발생한 경우 log를 남겨서 추후 log 분석을 통해 그 원인을 파악하여 bug를 수정하는 것이 중요 

 


 

오류와 예외 클래스

 

  • 시스템 오류(error) : 가상 머신에서 발생, 프로그래머가 처리할 수 없는 오류임

                                  ( 동적 메모리가 없는 경우, 스택 메모리 오버플로우 등)

                                

  • 예외(Exception) : 프로그램에서 제어할 수 있는 오류

                             ( 읽어 들이려는 파일이 존재하지 않거나, 네트워크이나 DB 연결이 안 되는 경우 등 )

 

  • 자바는 안전성이 중요한 언어로 대부분 프로그램에서 발생하는 오류에 대해 문법적으로 예외 처리를 해야 함

 

 

 

프로그램적으로 핸들링할 수 없는 것들 - 스택 오버 플로어 , 동적 메모리 할당 등 - Error 

프로그램적으로 핸들링할 수 있는 것들 - 파일 존재 여부, DB 연결 등 - Exception 

 

 Exception 최상위 클래스 - 모든 Exception의 최상위 클래스

 

 


 

예외 클래스들

 

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

 

 

  • 자바에서는 다양한 예외들에 대해 그 처리를 위한 클래스가 제공되고 있음

자바는 통제가능한 모든 예외상황에  Exception class 만들어놨다. 

 

  • Arithmetic Exception :정수를 0으로 나눈 경우 발생
  • NullPointerException : 초기화되지 않은 Object를 사용하는 경우
Dog d = null;
System.out.println(dog);
  • ArrayIndexOutOfBoundsException :배열의 크기를 넘어선 위치를 참조하려는 경우
  • FileNotFoundException :참조하는 파일이 지정된 위치에 존재하지 않는 경우
  • ClassNotFoundException :
Class.forName(“sis.studentinfo.Student”); //클래스가 로드되지 않은 경우
  • InterruptedException :Thread.sleep(), join(). Object의 wait()로 non-runnable 상태인 thread를 Runnable 하게 만들 수 있도록 사용할 수 있음

 

 

다 외울 필요는 없고, 필요한 상황에 맞는 Exception 가져다가 핸들링

 


 

예외 처리하기와 미루기

 

try-catch 문

  • try 블록에는 예외가 발생할 가능성이 있는 코드를 작성 try 블록 안에서 예외가 발생하는 경우 catch 블록이 수행됨

 

예외를 처리하는 부분 - 주로 log를 남긴다.

 


 

프로그래머가 예외를 처리해줘야 하는 예 ( 배열의 오류 처리 )

ArrayIndexException - i <5까지 해야 되는데 배열의 범위 넘었다.

컴파일시에는 오류가 나지 않지만 run타임시 오류&nbsp;


try - catch로 예외처리

 

가장 간단한 try - catch&nbsp;

 


 

try-catch-finally 문

  • finally 블록에서 파일을 닫거네트워크를 닫는 등의 리소스 해제 구현을 함
  • try { } 블록이 수행되는 경우, finally { } 블록은 항상 수행됨 - return이 있어도 finally {} 블록 수행됨
  • 여러 개의 예외 블록이 있는 경우 각각에서 리소스를 해제하지 않고 finally 블록에서 해제하도록 구현함
  • 컴파일러에 의해 예외가 처리되는 예 (파일 에러 처리)

 

컴파일러가 잡아낸 예외처리

컴파일러가 잡아낸 예외처리 - 처리방법 2가지 - throws 할 시 main이므로 java다운&nbsp;&nbsp;


try-catch-catch 마다 close의 try-catch 필요하다.

catch 가 여러개일 경우 - 각 블럭에 close - try/caych 필요 - 이렇게 하지말고 finally 부분에서하자

 


 

finally 부분에서 파일 닫는다 -  close의 try -catch 구현

 

 

+ catch 부분에 리턴 선언해줘도 -  finally 부분은 무조건 시행 

 

Exception 발생 시 넘어가는 catch 부분에 return을 선언해줘도 

finally 부분은 무조건 실행됨. -return 처리해줘서 end 부분은 실행 안됨.

 

 


 

try-with-resources문

  • 리소스를 사용하는 경우 close() 하지 않아도 자동으로 해제되도록 함
  • 자바 7부터 제공되는 구문
  • 리소스를 try() 내부에서 선언해야만 함
  • close()를 명시적으로 호출하지 않아도 try { } 블록에서 열린 리소스는 정상적인 경우나 예외가 발생한 경우 모두 자동으로 해제됨
  • 해당 리소스 클래스가 AutoCloseable 인터페이스를 구현해야 함
  • FileInputStream의 경우에는 AutoCloseable을 구현하고 있음
  • 자바 9부터 리소스는 try() 외부에서 선언하고 변수만을 try(obj)와 같이 사용할 수 있음

 


AutoCloseable 구현한 클래스 생성

리소스는 try( ) 외부에서 선언하고 변수만을 try(obj)와 같이 사용할 수 있음


실행 확인 --

 

AutoClose로 closing... 은 무조건 실행

예외처리 상황이므로 catch의 println("exception") 실행

예외 상황이지만 비정상 종료 안되고 빠져나와서 다음 수행문 "end" 출력 확인 

 


 

예외 처리 미루기

 

  • 예외 처리는 예외가 발생하는 문장에서 try-catch 블록으로 처리하는 방법과 이를 사용하는 부분에서 처리하는 방법 두 가지가 있음
  • throws를 이용하면 예외가 발생할 수 있는 부분을 사용하는 문장에서 예외를 처리할 수 있음

 

하나의 try {  } 블록에서 예외가 여러 개 발생하는 경우

  • 여러 개의 예외가 발생하는 경우 예외를 묶어서 하나의 방법으로 처리할 수도 있고, -  try/ multi catch
	try {
	test.loadClass("a.txt", "java.lang.String");
	} catch (FileNotFoundException | ClassNotFoundException e) {
		e.printStackTrace();
	}
  • 각각의 예외를 따로 처리할 수도 있음 ( catch - catch  )
		try {
			test.loadClass("a.txt", "java.lang.String");
		
		}catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}
  • Exception 클래스를 활용하여 defualt 처리를 할 때 Exception 블록은 맨 마지막에 위치해야 함( 맨 위에 있으면 최상위 클래스인 Exception으로 처리되어서 밑으로 갈 일이 없어진다. )

 


 

- Exception 내기 위한 메서드 생성 

 

- Thorws로 예외처리 미루기

 


 

어떻게 처리할 거냐 선택 -

멀티 캐치 / 트라이 캐치캐치 / throws는 현재 메인 부분이라 안됨

 

출력 테스트 -

 

오류 1 상황 - 파일이 없을 경우 - FileNotFoundException

 

오류 2 상황 - 파일이 이름 없을 경우 - FileNotFoundException

 

디폴트 Exception 도 맨 밑에 추가 가능

 


 

review

프로그램이 완성돼서 사용할 때 발생하는 모든 상황에 대해서 오류를 예방할 순 없다.
프로그래머가 제어할 수 있는 예외 상황들에 대해서는 문법적으로 예외 처리를 해주어 한다. 
비정상 종료를 피하고, log를 남겨서 bug를 수정하고, 핸들링하기 위해서

예외 처리를 위한 최상위 Exception 클래스 밑으로 수많은 예외처리 클래스들이 존재하는 것을 확인했다.
정말 생각보다 더 많은 경우들을 대비해서 만들어져 있었다.
이러한 예외 클래스들을 문법적으로 처리해주기 위해서
try-catch/  try-catch-finally / try-with-resources
예외처리 미루기
/ try-multi catch / 디폴트 Exception
사용법을 실습해보았다.

AutoCloseable 인터페이스를 구현한 리소스 클래스를 이용한
try-catch-resource문이 가장 보기 좋고 사용하기 편한 코드였는데,
아직 finally 방식으로 사용하는 곳도 많다고 하니 체크해 놓아야 할 것 같다.

배열의 경우는 컴파일에서는 오류가 나지 않았는데 실행 과정에서 오류가 나서 
프로그래머가 직접 예외 처리해주어야 했다.
java는 대부분의 예외 상황을 컴파일에서 잡아주기 때문에
어떤 상황에 어떤 예외를 사용할지와 예외상황 발생 시 로그를 어떻게 남겨서 수정할지
예외 처리를 어떻게 할지에 더 중점을 두고 생각해야 할 것 같다.