Sobes.tech
Junior

Kotlin-də istisnaları düzgün necə işləmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Kotlin-də istisnalarla işləmə try...catch...finally quruluşu ilə həyata keçirilir. Java kodu ilə qarşılıqlı əlaqə üçün @Throws ilə işarələnmiş funksiyaları çağırmaq mümkündür.

fun readFile(path: String): String {
    return try {
        // Təhlükəli kodu icra etməyə cəhd
        java.io.File(path).readText()
    } catch (e: java.io.IOException) {
        // Xüsusi istisnanı idarə etmək
        println("Faylı oxuyarkən xəta: ${e.message}")
        "" // Xəta halında default dəyər
    } finally {
        // Hər zaman icra olunan blok
        println("Fayl oxuma tamamlandı")
    }
}

Fərqli növ istisnaları idarə etmək üçün bir neçə catch bloku istifadə oluna bilər:

fun processData(data: String) {
    try {
        // NumberFormatException və ya NullPointerException yarada bilən kod
        val number = data.toInt()
        println("Rəqəm: $number")
    } catch (e: NumberFormatException) {
        println("Yanlış rəqəm formatı: ${e.message}")
    } catch (e: NullPointerException) {
        println("Null məlumatlar alındı: ${e.message}")
    }
}

Kotlin-də checked-istisnalar yoxdur, Java kimi. Funksiyalar @Throws istifadə edərək istisnaları bildirsə də, bu məcburi deyil.

Əgər funksiya uğurlu və ya uğursuz nəticə ilə bitə bilərsə, çox vaxt sealed-klasslar və ya Kotlin-in Result tipi (eksperimental versiyalarda) istifadə olunur, xüsusən asinxron kodlarda.

Sealed-klass nümunəsi:

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("Sıfıra bölmə")
        }
        Success(a / b)
    } catch (e: Throwable) {
        Error(e)
    }
}

// İstifadə:
fun processDivision() {
    when (val divisionResult = safelyDivide(10, 0)) {
        is Success -> println("Nəticə: ${divisionResult.value}")
        is Error -> println("Xəta: ${divisionResult.exception.message}")
    }
}

Yalnız idarə edə biləcəyiniz istisnaları tutmaq vacibdir. Boş catch bloklarından qaçının. Lazım gələrsə, istisnaları logda qeyd edə bilərsiniz.

throw açar sözündən istifadə edərək istisnaları açıq şəkildə ata bilərsiniz:

fun requirePositive(number: Int) {
    if (number <= 0) {
        throw IllegalArgumentException("Rəqəm müsbət olmalıdır")
    }
}