[스터디할래 09] 예외처리

이 글은 ‘백기선’ 개발자님과 함께하는 온라인 자바 스터디에 참여하여 준비/학습한 내용을 정리하는 글입니다.📚

정리는 Java Tutorials - Excepton를 기반으로 하였습니다.

Exception 이란 ?

자바가 제공하는 예외 종류

  1. Checked Exception
    • 어플리케이션이 에러 핸들러를 구현해서 에러 상황으로 부터 ‘recover’ 하길 기대하는 에외이다.
    • Checked Exception 은 Catch or Specify Requirement의 대상이다. 또한, Error, RuntimeException과 그 subclass를 제외한 모든 예외는 checked exception 이다.
  2. Error
    • 애플리케이션 외부 요인으로 인한 에외적 상황에서 사용된다. Catch or Specify Requirement의 대상이 아니다.
    • Error 및 그 서브클래스 객체이다.
    • 대표적 Error는 OutOfMemoryError, StackOverflowError가 있다.
    • Exception과 달리 에러 상황에서는 프로그램을 복구하지 않고 종료시키는 것이 관례이다.
  3. Runtime Exception
    • 애플리케이션 내부에서 일어났으나, 핸들을 강제하지 않는 예외이다.
    • RuntimeException 과 그 하위클래스이다.
    • Error와 Runtime Exception을 묶어서 unchekced exceptions라 한다.

Unchecked Exception - Controversy

(https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html)

자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

try, catch, finally

try {
	// 에외를 throw 하는 코드
} catch (ExceptionType1 | ExceptionType2 ... name) {
	// throw된 예외 타입과 핸들러의 타입이 일치하는 첫 번째 핸들러가 실행된다.
	// 하나의 핸들러에 여러 타입을 명시할 수도 있다. 이 경우 name은 내부적으로 final 변수이다.
} finally {
	// final 문은 선택적으로 선언할 수 있다. try 블럭이 실행된 이후에 반드시 실행되는 코드 블럭이다.
	// cleanup code 를 작성하는 데에 사용된다.
	// resource leak을 방지하는 주요 방법이다. 
}

try-with-resources

Before

static String readFirstLineFromFileWithFinallyBlock(String path)
                                                     throws IOException {
    // 리소스 선언
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
    	// finally에서 리소스를 정리해 주어야 함.
    	// 예외처리만 하다가 리소스 정리를 까먹는 경우도 왕왕 있다. 
    	// 그런 경우에 제대로 정리되지 않은 리소스사 쌓여서 leak이 발생하는 경우도 엄청 많다. 
        if (br != null) br.close();
    }
}

After

커스텀한 예외 만드는 경우