Kako pravilno obraditi izuzetke u Kotlinu?
sobes.tech АИ
Одговор од АИ
У Kotlin-у се користи конструкција 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}")
}
}
Kotlin нема checked-изузетака као у Јави. Функције могу да објаве да могу бацити изузетке помоћу @Throws, али то није обавезно за Kotlin код.
За случајеве када функција може успешно да се заврши или са грешком, често се користе 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}")
}
}
Важно је хвaтати само она изузења која можете обрадити. Не треба остављати празне catch блокове. Уколико је потребно, можете записати информације о изузетку у лог.
Такође можете изричито бацити изузетке помоћу throw:
fun requirePositive(number: Int) {
if (number <= 0) {
throw IllegalArgumentException("Број мора бити позитиван")
}
}