ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코틀린] 예외처리
    카테고리 없음 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("비밀번호에 느낌표가 포함되어 있지 않습니다.")
Designed by Tistory.