Kotlin Academy · Pelajaran

Melemparkan Ulang dan Merangkai Exception

Pilih exception yang perlu dilemparkan ulang dan bungkus error tingkat rendah dengan rangkaian cause.

Pelajaran 4 dari 413 langkah

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.

Gratis untuk memulai

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

  1. try/catch/finally sebagai Ekspresi
  2. Membuat Class Exception Kustom
  3. runCatching dan Result
  4. Melemparkan Ulang dan Merangkai Exception
← Kembali ke Kotlin Academy