Melemparkan Ulang dan Merangkai Exception
Pilih exception yang perlu dilemparkan ulang dan bungkus error tingkat rendah dengan rangkaian cause.
Melemparkan Ulang dan Merangkai Exception adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.
Melemparkan Kembali dan Membungkus
Terkadang Anda menangkap pengecualian hanya untuk melakukan log, membungkus, atau mengonversinya sebelum membiarkan pengecualian yang lebih spesifik diteruskan. Kotlin membuat pola ini idiomatis.
Melemparkan Kembali Secara Langsung
Untuk melemparkan kembali, cukup gunakan throw e lagi—penyebaran berlanjut ke penangan berikutnya.
fun main() {
try {
try { "x".toInt() }
catch (e: NumberFormatException) {
println("logging: ${e.message}")
throw e // re-throw original
}
} catch (e: NumberFormatException) {
println("outer caught: ${e.message}")
}
}Membungkus dengan Pengecualian Kustom
Teruskan pengecualian asli sebagai cause saat membuat pengecualian baru untuk mempertahankan rantainya.
class ParseException(msg: String, cause: Throwable) : RuntimeException(msg, cause)
fun main() {
try {
try { "xyz".toInt() }
catch (e: NumberFormatException) {
throw ParseException("could not parse user input", e)
}
} catch (e: ParseException) {
println("got: ${e.message}")
println("cause: ${e.cause?.message}")
}
}Memeriksa Rantai Penyebab
Properti cause tertaut ke pengecualian sebelumnya. Telusuri rantai tersebut untuk mencetak akar penyebab secara lengkap.
fun main() {
val e = RuntimeException("top",
RuntimeException("middle",
RuntimeException("root")))
var current: Throwable? = e
while (current != null) {
println(current.message)
current = current.cause
}
}Melemparkan Kembali Secara Selektif
Tangkap tipe yang umum, lalu lemparkan kembali jika NOT sesuai dengan kasus yang diharapkan.
fun parseRequired(s: String): Int {
try {
return s.toInt()
} catch (e: NumberFormatException) {
if (s.isBlank()) return 0
throw e // unexpected — let it propagate
}
}
fun main() {
println(parseRequired("42"))
println(parseRequired(""))
// parseRequired("abc") // throws
}Menambahkan Konteks
Bungkus dengan pengecualian domain untuk menambahkan konteks yang tidak dimiliki pengecualian asli (masukan, id permintaan, dan sebagainya).
class UploadError(msg: String, cause: Throwable) : RuntimeException(msg, cause)
fun upload(file: String) {
try { throw RuntimeException("disk full") }
catch (e: Throwable) { throw UploadError("uploading $file failed", e) }
}
fun main() {
try { upload("photo.jpg") }
catch (e: UploadError) { println("${e.message} <- ${e.cause?.message}") }
}Jangan Kehilangan Jejak Tumpukan
Saat membungkus, selalu teruskan pengecualian asli sebagai cause—jangan hanya membuat pengecualian baru dengan pesan yang sama tanpa penyebab. Jejak tumpukan adalah penyelamat Anda saat melakukan debug.
class Wrapped(m: String, cause: Throwable) : RuntimeException(m, cause)
fun main() {
try {
try { error("inner") }
catch (e: Throwable) { throw Wrapped("outer", e) }
} catch (e: Wrapped) {
println("message: ${e.message}")
println("cause: ${e.cause?.message}")
}
}Melemparkan Kembali Tanpa Membungkus
Jika yang Anda perlukan hanya pencatatan log, cukup gunakan throw e setelah pemanggilan log—tidak perlu membungkusnya.
fun risky() {
try { throw IllegalStateException("oops") }
catch (e: IllegalStateException) {
println("Logging before rethrow: ${e.message}")
throw e
}
}
fun main() {
try { risky() }
catch (e: IllegalStateException) { println("outer: ${e.message}") }
}finally untuk Pembersihan Saat Melemparkan Kembali
Gunakan finally untuk membersihkan sumber daya bahkan saat melemparkan kembali pengecualian.
fun process() {
try {
throw RuntimeException("failure")
} finally {
println("cleanup ran")
}
}
fun main() {
try { process() }
catch (e: RuntimeException) { println("caught: ${e.message}") }
}Pengecualian yang Ditekan
Jika finally sendiri melemparkan pengecualian, pengecualian asli secara bawaan ditekan. Gunakan addSuppressed untuk mempertahankan keduanya.
fun main() {
val primary = RuntimeException("primary")
val secondary = RuntimeException("from cleanup")
primary.addSuppressed(secondary)
println(primary.suppressed.joinToString { it.message ?: "?" })
}Antipola: Menelan Lalu Melemparkan Galat Berbeda
Menangkap satu pengecualian lalu melemparkan pengecualian baru yang tidak berkaitan (tanpa penyebab) akan menghilangkan informasi untuk penelusuran kesalahan. Selalu teruskan cause.
// BAD
// catch (e: IOException) { throw RuntimeException("error") }
// GOOD
// catch (e: IOException) { throw RuntimeException("error reading config", e) }
fun main() { println("Pass cause when re-throwing!") }Pemeriksaan Singkat
Saat Anda membungkus pengecualian ke dalam pengecualian baru, apa yang harus Anda lakukan untuk mempertahankan jejak tumpukan asli?
Ringkasan
Untuk melemparkan ulang: throw e. Untuk membungkus: lemparkan pengecualian baru dengan cause = e. Selalu pertahankan rantai penyebab—jangan pernah membuat pembungkus tanpa penyebab. Gunakan finally untuk pembersihan, dan addSuppressed saat pembersihan itu sendiri gagal.
Belajar Kotlin dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Melemparkan Ulang dan Merangkai Exception” gratis?
Ya — teks lengkap “Melemparkan Ulang dan Merangkai Exception” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Melemparkan Ulang dan Merangkai Exception”?
Pilih exception yang perlu dilemparkan ulang dan bungkus error tingkat rendah dengan rangkaian cause. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Kotlin Academy?
Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Melemparkan Ulang dan Merangkai Exception” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?
Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- try/catch/finally sebagai Ekspresi
- Membuat Class Exception Kustom
- runCatching dan Result
- Melemparkan Ulang dan Merangkai Exception