-
[코틀린] 예외처리카테고리 없음 2024. 3. 12. 09:59
원리
함수 실행 중 오류가 발생하면 예외를 던져서
함수를 호출하는 쪽에서는 해당 예외를 잡아 처리할 수 있다.
예외를 처리하지 않는 경우 함수를 계속 타고 올라가 예외를 처리할 때까지 예외를 던진다.
사용법
input으로 "1000?!!"을 입력받았다고 가정하고 String#toInt()를 사용하면 NumberFormatException이 뜰 것이다.
그리고 당연히 실행 도중 예외가 발생하였기 때문에 println은 출력되지 않는다.
val input = "1000?!!" val number = input.toInt() println("숫자 ${number}을(를) 입력하였습니다.")
여기서 try catch문으로 예외를 잡아서 숫자가 아닌 경우 에러 메시지를 뜨게할 수 있다.
(솔직히 try catch보다 toIntOrNull()로 받아서 null 처리를 해주는게 깔끔해 보이지만..)
val number = try { "1000?!!".toInt() } catch (e: NumberFormatException) { println("숫자만 입력할 수 있습니다.") return } println("숫자 ${number}을(를) 입력하였습니다.") //ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ val number = "1000?!!".toIntOrNull() ?: run { println("숫자만 입력할 수 있습니다.") return } println("숫자 ${number}을(를) 입력하였습니다.")
예외 던지기
개발자가 의도적으로 예외를 발생시킬 수도 있다.
아래처럼 signUp 함수에서 아이디에 느낌표가 들어가 있는걸 체크하여
throw를 해주고 해당 함수를 호출한 곳에서 catch 하도록 하였다.
fun main() { println("아이디를 입력해주세요.") val id = readln() println("비밀번호를 입력해주세요.") val password = readln() try { signUp(id, password) } catch (e: IdFormatException) { println(e.message) // "아이디에 느낌표를 넣을 수 없습니다." } } fun signUp(id: String, password: String) { if (id.contains("!")) { throw IdFormatException() } if (!password.contains("!")) { throw PasswordFormatException() } // DB에 올리는 코드 } class IdFormatException : RuntimeException("아이디에 느낌표를 넣을 수 없습니다.") class PasswordFormatException : RuntimeException("비밀번호에 느낌표가 포함되어 있지 않습니다.")