როგორ სწორად მოვახდინოთ გამონაკლისების დამუშავება Kotlin-ში?
sobes.tech AI
პასუხი AI-სგან
Կոտլինում արտահայտությունների մշակման համար օգտագործվում է 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}")
}
}
Կոտլինում չկան ստուգված արտահայտություններ, ինչպես 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("Թիվը պետք է լինի դրական")
}
}