Sobes.tech
Junior

როგორ სწორად მოვახდინოთ გამონაკლისების დამუშავება Kotlin-ში?

sobes.tech AI

პასუხი AI-სგან

Կոտլինում արտահայտությունների մշակման համար օգտագործվում է try...catch...finally կառուցվածքը։ Կարող եք կանչել @Throws նշված ֆունկցիաները Java կոդի հետ փոխազդեցության համար։

fun readFile(path: String): String {
    return try {
        // Փորձել վտանգավոր կոդը
        java.io.File(path).readText()
    } catch (e: java.io.IOException) {
        // Հատուկ արտահայտության մշակումը
        println("Սխալ ֆայլը ընթերցելիս: ${e.message}")
        "" // Սխալի դեպքում վերադարձնել նախնական արժեքը
    } finally {
        // Բլոկ, որը միշտ կատարվում է, անկախ արտահայտությունից
        println("Ֆայլի ընթերցման փորձը ավարտվեց")
    }
}

Կարող եք օգտագործել մի քանի catch բլոկներ տարբեր արտահայտությունների մշակման համար:

fun processData(data: String) {
    try {
        // Կոդ, որը կարող է առաջացնել NumberFormatException կամ NullPointerException
        val number = data.toInt()
        println("Թվային արժեքը՝ $number")
    } catch (e: NumberFormatException) {
        println("Անվավեր թվային ֆորմատ: ${e.message}")
    } catch (e: NullPointerException) {
        println("Ստացված զրոյական տվյալներ: ${e.message}")
    }
}

Կոտլինում չկան ստուգված արտահայտություններ, ինչպես Java-ում։ Ֆունկցիաները կարող են հայտարարել, որ կարող են արտածել արտահայտություններ @Throws նշելով, բայց դա պարտադիր չէ։

Երբ ֆունկցիան կարող է հաջողությամբ կամ սխալով ավարտվել, հաճախ օգտագործում են sealed-կլասներ կամ Result-տիպ (փորձնական տարբերակներում Kotlin-ի) արտահայտությունների փոխարեն, հատկապես ասինխրոնային կոդում։

Օրինակ sealed-կլասով:

sealed class Result<out T>
data class Success<out T>(val value: T) : Result<T>()
data class Error(val exception: Throwable) : Result<Nothing>()

fun safelyDivide(a: Int, b: Int): Result<Int> {
    return try {
        if (b == 0) {
            throw ArithmeticException("Բաժանում զրոյով")
        }
        Success(a / b)
    } catch (e: Throwable) {
        Error(e)
    }
}

// Օգտագործում՝
fun processDivision() {
    when (val divisionResult = safelyDivide(10, 0)) {
        is Success -> println("Արդյունք: ${divisionResult.value}")
        is Error -> println("Սխալ: ${divisionResult.exception.message}")
    }
}

Կարևոր է բռնել միայն այն արտահայտությունները, որոնք կարող եք մշակել։ Չպետք է թողնել դատարկ catch բլոկներ։ Պետք է կարող եք գրանցել արտահայտության մասին տեղեկությունները։

Կարող եք նաև արտածել արտահայտությունները throw բանալի բառով՝

fun requirePositive(number: Int) {
    if (number <= 0) {
        throw IllegalArgumentException("Թիվը պետք է լինի դրական")
    }
}