[Kotlin] 코틀린에서의 예외 처리

DaeHoon·2022년 7월 30일
1
  • 김영한님의 스프링 DB 강의를 코틀린으로 복습하던 중, 자바 예외 처리에 대한 내용이 나왔다.
  • 코드를 따라 치는 것 보단, 코틀린은 어떤 방식으로 예외를 처리하는지 정리하고 5장을 스킵할 예정이다.

1. 코틀린의 예외 처리

  • 코틀린의 예외( Exception) 처리는 일반적으로 자바의 예외 처리와 비슷하다.
  • 단 자바는 체크 예외, 언체크 예외라는 개념이 있어 Throws라는 키워드가 있지만, 코틀린은 예외 처리 방식에 차별을 두지 않아 Throws 키워드가 없다

1-1. try, catch, finally

  • 자바와 마찬가지로 예외를 처리하려면 try, catch, finally를 사용한다.
fun readNumber(reader: BufferedReader): Int? { // 체크 예외인 IOException이지만 명시하지 않음.
	try{
    	val line = reader.readLine()
        return Integer.parseInt(line)
    } catch (e: NumberFormatException){
    	return null
    } finally{
    	reader.close()
    }
}

fun main(){
	val reader = BufferReader(StringReader("239"))
    println(readNumber(reader))
}
239
  • 자바 코드와 가장 큰 차이는 throws절이 코드에 없다. 자바 같은 경우 함수 뒤에 throws IOException을 붙여줘야 하는데, IOException가 체크 예외이기 때문이다.
  • 자바에서는 체크 예외를 명시적으로 처리해야 한다. catch로 예외를 처리하거나, throws로 호출한 곳에 예외를 던져줘야 한다.

1-2. 체크 예외 언체크 예외를 구별하지 않는 코틀린

  • 코틀린에서는 함수가 던지는 예외를 지정하지 않고 발생한 예외를 잡아내도 되고 안 잡아도 된다.
  • 자바는 체크 예외 처리를 강제한다. 하지만 프로그래머들이 의미 없이 예외를 다시 던지거나, 예외를 잡되 처리하지는 않고 그냥 놔두는 코드를 작성하는 경우가 흔하다. 그로 인해 예외 처리 규칙이 실제로는 오류를 방지하지 못하는 경우가 자주 있다.

1-3. Example

  • 위의 코드에서 NumberFormatException은 체크 예외가 아니다. 따라서 자바 컴파일러는 NumberFormatException를 잡아내게 강제하지 않는다. 그에 따라 실제 실행 시점에 NumberFormatException이 발생하는 모습을 자주 볼수 있다. 하지만 입력 값이 잘못되는 경우는 흔히 있는 일이므로 그런 문제가 발생한 경우 부드럽게 다음 단계로 넘어가도록 프로그램을 설계해야 한다는 점에서 이는 불행한 일이다.

  • BufferedReader.close는 IOException을 던질 수 있는데, 그 예외는 체크 예외이므로 자바에서 반드시 처리해야 한다. 하지만 실제 스트림을 닫다가 실패하는 경우, 스트림을 사용하는 클라이언트 프로그램이 취할 수 있는 의미 동작은 없다. 그러므로 이 IOException을 잡아내는 코드는 불필요하다.


Reference: Kotlin IN ACTION

profile
평범한 백엔드 개발자

1개의 댓글

comment-user-thumbnail
2022년 8월 9일

안녕하세요~ 대훈님:)
벨로그에서 처음 뵙겠습니다.
좋은 글 잘 읽었습니다!

답글 달기