Чӣ гуна бояд хатогиҳоро дар Kotlin дуруст коркард кард?
sobes.tech AI
Ҷавоб аз AI
В 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 истисноҳои санҷидашударо, ки дар 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("Рақам бояд мусбат бошад")
}
}