예외처리(exception handling)

geonu·2022년 3월 14일
0
post-custom-banner

출처 : 자바의 정석
http://www.yes24.com/Product/Goods/24259565
https://cafe.naver.com/javachobostudy/20665

아래의 내용은 '자바의 정석'이라는 책의 내용을 간략하게 정리한 글입니다.

프로그램 오류

  • 컴파일 에러 : 컴파일 시에 발생하는 에러
  • 런타임 에러 : 실행 시에 발생하는 에러
  • 논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것

프로그램이 꺼지거나 의도하지 않은 로그가 많이 보일 때 구분없이 '에러'라고 지칭하고 사용해왔다.
하지만 이제는 에러와 예외를 구분해야한다.

  • 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  • 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 오류

예외(Exception)

예외 클래스는 두 분류로 나뉜다.

  • Exception 클래스들 : 사용자에 의한 예외
  • RuntimeException 클래스들 : 개발자에 의한 예외

예외처리 (try-catch)

비정상적인 프로그램 종료를 막고, 런타임을 유지하면서 예외를 대응한다.

try {
	//예외 발생 가능성이 있는 코드
} catch(Exception e){
	//Exception 발생시 실행할 코드
}

catch블럭에서 인스턴스를 instanceof 연산자로 검사하여 'true'가 나올 때까지 계속 검사한다.
'true'가 나온 블럭의 문장들을 수행 후 try-catch문을 빠져나온다.

printStackTrace() & getMessage()

  • printStackTrace()
    예외발생 당시의 호출스택(Call Stack)에 있던 메서드의 정보와 예외 메세지 출력

  • getMessage()
    발생한 예외클래스의 인스턴스에 저장된 메세지 get

예외 발생시키기

throw new Exception("Exception 고의 발생");

checked 예외 & unchecked 예외

  • checked 예외(Exception클래스들)

    컴파일러가 예외처리를 확인하는 예외
    예외처리를 하지 않으면 컴파일부터 안된다.

  • unchecked 예외(RuntimeException클래스들)

    컴파일러가 예외처리를 확인하지 않는 예외
    예외처리를 하지 않아도 컴파일이 된다.
    하지만 예외 발생시 비정상적으로 종료된다.

메서드에 예외 선언

메서드의 선언부에 키워드 throws를 사용해서 메서드 내에서 발생할 수 있는 예외를 기입한다.
메서드 사용자가 메서드 선언부만 보고 발생할 예외를 예측하고 대비할 목적이다.

throws는 예외처리가 아니라 throws가 명시된 메서드를 호출한 메서드에게 예외를 전달하는 것이다.

finally block

예외의 발생여부에 상관없이 마지막에 무조건 실행되어야할 코드 블럭
try블럭에 return문이 실행되어도 finally블럭이 실행되고 종료된다.

자동 자원 반환 try-with-resource문

JDK1.7부터 try-with-resource문이 추가됐다.

try (FileInputStream fis = new FileInputStream("File.txt");
     DataInputStream dis = new DataInputStream(fis)){
}catch(Exception e){}

try 괄호 안에 객체 생성 문장을 넣으면 이 객체는 따로 close()를 호출하지 않아도 try블럭을 벗어나는 순간 자동으로 close()를 호출한다.

단, try-with-resource문에 의해 자동으로 close()가 호출되려면 try 괄호 안에 생성된 객체가 AutoCloseable이라는 인터페이스를 구현한 것만 된다.

try-with-resource에서 두 예외가 발생하면 먼저 발생한 예외를 실제 발생한 예외로 다루고 나중에 발생한 예외를 억제된(suppressed)예외로 다룬다.
출력문에 suppressed 예외 문장이 같이 출력된다.
try-catch문에서는 먼저 발생한 예외는 무시되고 마지막에 발생한 예외만 출력한다.

사용자정의 예외

Exception or RuntimeException을 상속받아 구현

기존에는 견고한 프로그램을 위해 예외처리를 무조건 해야하는 checked 예외가 주를 이루었지만
요즘에는 예외처리를 선택적으로 사용하는 unchecked 예외를 많이 사용한다.

예외 되던지기(exception re-throwing)

발생할 수 있는 예외가 여러 개인 경우, 메서드 내에서 예외처리하고 호출한 메서드에서도 처리하도록 할 수 있다.
예외를 처리한 후 인위적으로 예외를 다시 발생시키는 방법으로 구현한다.

public static void main(String[] args){
	try{
    	method();
    }catch (Exception e){
    	//후 예외처리
    }
}

static void method() throws Exception{
	try{
    	throw new Exception();
    }catch (Exception e){
    	//선 예외처리
    	throw e;	//인위적 예외 발생
    }
}
profile
시작이 있어야
post-custom-banner

0개의 댓글