Kotlin 예외처리

고성욱·2023년 4월 4일
0

안드로이드

목록 보기
26/26

코틀린의 예외 처리는 자바와 접근방법이 아주 비슷하다. 함수는 정상 종료, 즉 어떤 값을 반환하거나 비정상적으로 오류가 발생한 경우 예외를 던질 수 있다. 예외가 발생한 경우에는 함수를 호출한 쪽에서 예외를 잡아내거나 (catch) 잡아내지 않는 경우 함수 호출 스택의 위로 예외가 전달 될 수 있다.

예외 던지기

오류 조건을 신호로 보내려면 자바와 마찬가지로 throw 식에 예외 객체를 사용해야 한다. 문자열이 잘못된 경우 어떤 폴백(fallback) 값을 돌려주는 대신 오류를 발생시키도록 바꿔야한다.

fun parseIntNumber(s: String): Int{
	var num = 0
	
	if(s.length !in 1..31) throw NumberFormatException("Not a number: $s")
	
	for(c in s) {
		if(c !in '0'..'1') throw NumberFormatException("Not a number: $s")
		num = num*2 + (c - '0')
	}
	return num
}
  • 자바와 달리 코틀린은 클래스 인스턴스를 생성(위는 예외) 할 때 new 같은 구문을 사용하지 않는다.
    NumberFormatException처럼 생성자 호출도 일반 함수 호출과 똑같이 생겼다.

예외를 던지면 생기는 일

  • 프로그램은 예외를 잡아내는 핸들러를 찾는다. 예외와 일치하는 예외 핸들러가 있다면, 예외 핸들러가 예외를 처리한다.
  • 현재 함수 내부에서 핸들러를 찾을 수 없으면 함수 실행이 종료되고 함수가 스택에서 제거(pop)된다.
    그리고 호출한 쪽의 문맥 안에서 예외 핸들러 검색을 수행한다. 이런경우 예외 호출자에게 전파 했다고 한다.
  • 프로그램 진입점에 이를 때까지 예외를 잡아내지 못하면 현재 스레드가 종료된다.

→ 코틀린의 예외 처리 단계는 기본적으로 자바와 같다.

  • 코틀린에서 break나 continue와 같이 throws 식에도 Nothing 타입식이다.
fun sayHello(name: String){
	val message = 
		if(name.isNotEmpty()) "Hello $name"
		else throw IllegalArgumentException("Empty name")

	println(message)
}

try 문으로 예외 처리

  • 코트린에서도 예외를 처리 할 때는 기본적으로 자바와 똑같은 문법인 try문을 사용한다.
import java.lang.NumberFormatException

fun readInt(default: Int): Int {
	try{
		return redLine()!!.toInt()
	} catch (e: NumberFormatException){
		return defualt
	}
}
  • 예외가 발생 할 수 있는 코드를 try문으로 감싼다. try문에는 최소한 하나 이상 적절한 탑입의 예외를 잡아내는 catch블록이 있어야 한다.
  • 처리할 예외는 파라미터로 표현된다. catch 블록의 내부에서는 이 파라미터를 마음대로 쓸수 있다.
  • catch 블록은 선언된 순서대로 예외타입을 검사하기 때문에 어떤 타입을 처리할 수 있는 catch 블록을 그 타입 상위 타입을 처리할 수 있는 catch블록 보다 앞에 작성해야 한다. 그렇지 않으면 상위 타입을 잡아내는 핸들러가 하위 타입인 예외도 모두 잡아내버린다.
  • 코틀린에는 검사 예외와 비검사 예외를 구분하지 않는다.
profile
안드로이드, 파이썬 개발자

0개의 댓글