Kuidas õigesti Kotlinis erandeid töödelda?
sobes.tech AI
Vastus AI-lt
Kotlinis veida izņēmumu apstrādei izmanto try...catch...finally struktūru. Var izsaukt funkcijas, kas ir atzīmētas ar @Throws, lai sadarboties ar Java kodu.
fun readFile(path: String): String {
return try {
// Mēģinājums izpildīt bīstamu kodu
java.io.File(path).readText()
} catch (e: java.io.IOException) {
// Konkrētas izņēmuma apstrāde
println("Kļūda, lasot failu: ${e.message}")
"" // Atgriezt noklusējuma vērtību kļūdas gadījumā
} finally {
// Bloks, kas vienmēr tiek izpildīts, neatkarīgi no izņēmuma
println("Faila lasīšanas mēģinājums pabeigts")
}
}
Var izmantot vairākus catch blokus dažādu izņēmumu apstrādei:
fun processData(data: String) {
try {
// Kods, kas var izraisīt NumberFormatException vai NullPointerException
val number = data.toInt()
println("Skaitlis: $number")
} catch (e: NumberFormatException) {
println("Nederīgs skaitļa formāts: ${e.message}")
} catch (e: NullPointerException) {
println("Saņemti null dati: ${e.message}")
}
}
Kotlin nav checked izņēmumu kā Java. Funkcijas var paziņot, ka tās var izraisīt izņēmumus ar @Throws, bet tas nav obligāti Kotlin kodā.
Situācijās, kad funkcija var veiksmīgi pabeigt vai ar kļūdu, bieži izmanto sealed klases vai Result tipu (eksperimentālās Kotlin versijās) vietā izņēmumiem, īpaši asinhronajā kodā.
Piemērs ar sealed klasi:
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("Dališana ar nulli")
}
Success(a / b)
} catch (e: Throwable) {
Error(e)
}
}
// Izmantošana:
fun processDivision() {
when (val divisionResult = safelyDivide(10, 0)) {
is Success -> println("Rezultāts: ${divisionResult.value}")
is Error -> println("Kļūda: ${divisionResult.exception.message}")
}
}
Svarīgi ir noķert tikai tās izņēmumu veidus, kurus var apstrādāt. Neatstājiet tukšus catch blokus. Ja nepieciešams, ierakstiet izņēmuma informāciju žurnālā.
Tāpat var izsviest izņēmumu tieši ar throw:
fun requirePositive(number: Int) {
if (number <= 0) {
throw IllegalArgumentException("Skaitlis jābūt pozitīvs")
}
}