프로그램 오류(error)
프로그램이 정상적으로 실행되지 못하고 오작동 또는 비정상적 종료를 발생시키는 경우를 말한다.
자바(.java) → 기계어(.class)로 변환하는 과정을 ‘컴파일’(compile)이라고 한다. 컴파일러는 컴파일 과정에서 문법 검사를 진행한다. 이 과정에서 문제가 있는 경우 오류 메시지와 함께 컴파일을 중단한다. 컴파일 중 불명확한 코드에 대해서 경고를 보내기도 한다. 오류 메시지를 보고 잘못된 코드를 수정하는 과정을 ‘디버깅’(debugging)이라고 한다. 오류 발생시점에 따라 ‘컴파일 오류’(compile error)와 실행 오류(runtime error)로 나뉜다. 컴파일 오류는 구문(syntax) 오류가 발생하고, 실행 오류로는 논리(logic) 오류, 시스템(system) 오류, 예외(exception)가 발생한다.
예외(Exception)
프로그램 실행 중 흐름이 중단되는 것을 말하며 오류와 다르게 대처를 가능케 하여 프로그램의 실행이 중단되지 않게 한다. 프로그램의 실행이 중단되지 않도록 대처하는 과정을 ‘예외 처리’(exception handling)이라고 한다.
try{
// 예외 발생 가능성이 있는 코드를 작성
} catch(Exception e) {
// 예외 발생 시 처리 또는 로그 코드 작성
} finally {
// 예외 발생과 관계없이 마지막 단계에서 무조건 실행
}
// try-with-resources
// 반납할 resource가 있는 경우 try-with-resources를 사용하면 finally에서 반납하지 않아도 자동으로 반납
try(InputStream input = new FileInputStream(source)) {
// try 구문
} catch(Exception e) {
// 예외처리구문
}
예외처리(exception handling)
예외는 ‘검증된(checked) 예외’와 ‘검증되지 않은(unchecked) 예외’로 나뉜다. 검증된 예외는 컴파일러가 검증하는 예외이며, 사용자 정의 예외라고도 한다. 예측이 가능하며 수습도 가능하기 때문에 반드시 예외처리를 한다. 검증되지 않은 예외는 컴파일러가 검증하지 못하는 예외이며, 실행 예외(runtime exception)가 속한다. 검증되지 않은 예외는 예외 처리를 하기보다 예외가 발생하지 않도록 버그를 잡아야 한다.
예외처리방법
- 예외 복구
- try ~ catch - 상위 클래스에 제공하는 데이터에서 이상이 없고, 자신이 처리하는 동안 발생한 예외이므로 자신이 처리할 책임을 가짐
- 예외 처리 회피
- throws - 데이터를 제공하는 곳에서 예외를 처리할 책임이 있으니 상위 클래스로 예외를 던짐
- 예외 처리 전환
- throws 하기 전 Exception 객체를 전환해 던진다 전환하는 이유는?
- 발생한 예외의 의미를 명확하게 하고 싶거나
- 복구 불가능한 예외를 RuntimeException()으로 던져 불필요한 throws 선언을 하지 않도록 하거나
예외처리전략
- 예외로 무엇을 할지 알 때까지는 잡지 않는다.
- 예외가 발생할 시 해당 절차를 다루는 클래스(또는 어떻게 해야 하는지 알고 있는)까지 예외를 던진다.
- 예외처리 전략의 과정
- 예외 클래스를 정의하고, 언제, 어디서 던지고, 잡아 처리할 지 결정
- 비즈니스 로직에 전념하고 예외 처리가 필요한 곳에는 주석으로 예외처리 표시
- 예외 처리가 필요한(주석 처리 부분) 곳에 실제로 에러 처리 코드 삽입