KotlinInAction/코틀린 기초

코틀린의 예외 처리

webmaster 2022. 7. 26. 17:40
728x90

함수는 정상적으로 종료할 수 있지만 오류가 발생하면 예외를 던질 수 있다.

함수를 호출하는 쪽에서는 그 예외를 잡아 처리할 수 있다.

발생한 예외를 함수 호출 단에서 처리하지 않으면 함수 호출 스택을 거슬러 올라가면서 예외를 처리하는 부분이 나올 때까지 예외를 다시 던진다.

throw를 생성할 때에도 마찬가지로 new를 붙이지 않는다.

try, catch, finally

fun readNumber(reader: BufferedReader) : Int? {
    try {
        val line = reader.readLine()
        return Integer.parseInt(line)
    }catch (e: java.lang.NumberFormatException){
        return null
    }finally {
        reader.close()
    }
}
  • 자바 코드랑 가장 큰 차이는 throws절이 코드에 없다
    • 함수를 작성할 때 throws IOException 절을 붙여야 하는데 이는 IOException이 체크 예외 이기 때문이다
  • 코틀린은 체크, 언체크 예외를 구분하지 않는다.
    • 함수가 던지는 예외를 지정하지 않고 발생한 예외를 잡아내도 되고 잡지 않아도 된다.
    • 많은 프로그래머들이 체크 예외, 언체크 예외 구분 없이 예외를 던지는 경우가 많기 때문에 코틀린은 이걸 고려하여 작성했다
    • 예를 들어 NumberFormatException, IOException을 생각하자
      • NumberFormatException 은 체크 예외가 아니므로 자바 컴파일러는 NumberFormatException을 잡아내게 강제하지 않는다. 그에 따라 해당 오류는 부드럽게 다음 단계로 넘어가는 측면에서는 불행한 일이다
      • IOException은 체크 예외로 자바에서는 반드시 처리해야 하는 에러인데 해당 오류를 잡아서 클라이언트가 취할 수 있는 동작이 없기 때문에 IOException를 잡아내는 코드는 불필요하다

try를 식으로 이용

fun readNumber(reader: BufferedReader) {
    val number = try {
        Integer.parseInt(reader.readLine())
    }catch (e: java.lang.NumberFormatException){
        return
    }
    println(number)
}
fun main(args: Array<String>) {
    val reader = BufferedReader(StringReader("not a number"))
    readNumber(reader)
}
  • try에 if, when과 같이 변수를 대입할 수 있다.
    • 단 if,when 과 달리 try의 본문을 반드시 중괄호({}) 로 둘러싸야한다.
    • 다른 문장과 마찬가지로 try의 본문도 내부에 여러 문장이 있으면 마지막 식의 값이 전체 결괏값이다.
  • catch에 return문을 사용한다
    • 예외가 발생한 경우 catch 블록 다음의 코드는 실행되지 않는다
    • 계속 진행하고 싶다면 catch블록도 값을 만들어야 한다
fun readNumber(reader: BufferedReader) {
    val number = try {
        Integer.parseInt(reader.readLine())
    }catch (e: java.lang.NumberFormatException){
        null
    }
    println(number)
}
  • catch에서 반환하는 값으로 null을 반환한다
  • 그리고 println문을 쭉 진행한다
728x90

'KotlinInAction > 코틀린 기초' 카테고리의 다른 글

While과 for 루프  (0) 2022.07.26
enum과 when  (0) 2022.07.25
클래스와 프로퍼티  (0) 2022.07.25
함수와 변수  (0) 2022.07.25