Πώς χειριζόμαστε σωστά τις εξαιρέσεις στο 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("Λάβαμε null δεδομένα: ${e.message}")
}
}
Η Kotlin δεν έχει checked-εξαιρέσεις όπως η 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("Ο αριθμός πρέπει να είναι θετικός")
}
}