Sobes.tech
Junior

Kotlin'da istisnolarni qanday to'g'ri ishlash kerak?

sobes.tech AI

AIdan javob

Kotlinda istisnolarni boshqarish try...catch...finally konstruktsiyasi yordamida amalga oshiriladi. Siz @Throws bilan belgilangan funksiyalarni chaqirishingiz mumkin, bu Java kodi bilan muloqot qilish uchun.

fun readFile(path: String): String {
    return try {
        // Xavfli kodni bajarishga urinish
        java.io.File(path).readText()
    } catch (e: java.io.IOException) {
        // Aniq istisnani boshqarish
        println("Faylni o'qishda xato: ${e.message}")
        "" // Xato holatida standart qiymat
    } finally {
        // Har doim bajariladigan blok
        println("Faylni o'qish tugadi")
    }
}

Turli xil istisnalarni boshqarish uchun bir nechta catch bloklari ishlatilishi mumkin:

fun processData(data: String) {
    try {
        // NumberFormatException yoki NullPointerException chaqirishi mumkin bo'lgan kod
        val number = data.toInt()
        println("Raqam: $number")
    } catch (e: NumberFormatException) {
        println("Noto'g'ri raqam formati: ${e.message}")
    } catch (e: NullPointerException) {
        println("Null ma'lumotlar: ${e.message}")
    }
}

Kotlinda checked-istisnalar mavjud emas, Java kabi. Funktsiyalar @Throws yordamida istisnalarni e'lon qilishi mumkin, ammo bu Kotlin kodida majburiy emas.

Agar funksiyaning muvaffaqiyatli yoki xato bilan yakunlanishi mumkin bo'lsa, odatda sealed-klasslar yoki Kotlinning Result turi (eksperimental versiyalarida) ishlatiladi, ayniqsa asinxron kodda.

Sealed-klass misoli:

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("Nolga bo'lish")
        }
        Success(a / b)
    } catch (e: Throwable) {
        Error(e)
    }
}

// Foydalanish:
fun processDivision() {
    when (val divisionResult = safelyDivide(10, 0)) {
        is Success -> println("Natija: ${divisionResult.value}")
        is Error -> println("Xato: ${divisionResult.exception.message}")
    }
}

Faqat boshqariladigan istisnalarni tutish muhim. Bo'sh catch bloklaridan saqlaning. Zarur bo'lsa, istisnani logga yozish mumkin.

Shuningdek, throw kalit so'zi yordamida istisnalarni aniq tashlash mumkin:

fun requirePositive(number: Int) {
    if (number <= 0) {
        throw IllegalArgumentException("Raqam musbat bo'lishi kerak")
    }
}