본문 바로가기
프로그래밍 놀이터/Kotlin, Coroutine

[kotlin] Sealed class 를 이용하여 error 를 다루는 방법

by 돼지왕 왕돼지 2020. 8. 8.
반응형


kotlin sealed class error handling


https://articles.caster.io/android/handling-optional-errors-using-kotlin-sealed-classes/


-

private fun parse(url:String): ParsedData{
    val result = URL_PARSE_REGEX.find(url)
    if( result == null){
        // what to do here?
    }

    val mimeType = result.groupValues[2]
    val data = result.groupValues[4]
    return ParsedData(data, mimeType)
}

data class ParsedData(val data:String, val mimeType:String)
위와 같은 코드가 있다.


-

result == null 일 때 일반적으로 다음과 같은 코딩이 가능할 것이다.

1. Throw an exception

2. Return null -> return type 을 nullable 로 만듬.

3. Wrapper object 를 만들어 넘김

    아래와 같이 만들고, 사용측에서는 parsedData 의 null 값을 보고 로직 분기를 한다.

    class ResultWrapper(val data:ParsedData? = null, val errorMessage:String? = null)



-

더 좋은 solution 이 있다. Sealed class 를 사용하는 것이다.

물론 모든 케이스에 적용 가능한 것은 아니다.

sealed class ParseResult

data class Error(val errorMessage:String) : ParseResult()
data class ParsedData(val data:String, val mimeType:String) : ParseResult()


사용 측에서는 smartcast 를 이용하면 된다.

private fun parse(url:String): ParseResult{
    val result = URL_PARSE_REGEX.find(url)
    if( result == null ){
        return ParseResult.Error(“No match found”)
    }

    val mimeType = result.groupValues[2]
    val data = result.groupValues[4]
    return ParseResult.ParsedData(data, mimeType)
}

when( parse(url) ){
    is ParseResult.ParsedData -> // do something with success result
    is ParseResult.Error -> log(result.errorMessage)
}



-

sealed class 대신 abstract class 하는 것에 대한 논쟁이 있을 수 있다.

sealed class 의 장점은…

1. abstract 로 둘 경우 project 어디서든 subclass 를 정의하도록 둘 수 있다. (원하지 않는 구현일 수 있다.) sealed class 의 경우도 subclass 를 가질 수 있지만, 반드시 같은 파일 안에서 정의되어야 한다.

2. when 구문에서 다루지 않은 type 에 대한 알림도 받을 수 있다.



-

끝!!!




반응형

댓글