0Pricing
Kotlin Academy · Pelajaran

Membuat Class Exception Kustom

Definisikan exception khusus domain dengan pesan dan properti yang bermakna.

Membuat Class Exception Kustom adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.

Mengapa Pengecualian Kustom?

Pengecualian kustom menyampaikan makna domain: pemanggil dapat menangkapnya secara spesifik, memperoleh pesan yang berguna, dan bertindak secara berbeda berdasarkan tipenya.

Pengecualian Kustom Paling Sederhana

Turunkan Exception (atau subkelas tertentu seperti RuntimeException) dan teruskan pesan ke konstruktor super.

class InvalidEmailException(message: String) : Exception(message)
fun main() {
    try {
        throw InvalidEmailException("missing @")
    } catch (e: InvalidEmailException) {
        println("caught: ${e.message}")
    }
}

Pengecualian dengan Properti

Tambahkan bidang untuk menyampaikan konteks: status HTTP, nama bidang, jumlah percobaan ulang, dan sebagainya.

class HttpError(
    message: String,
    val statusCode: Int
) : Exception(message)
fun main() {
    try {
        throw HttpError("Not Found", 404)
    } catch (e: HttpError) {
        println("HTTP ${e.statusCode}: ${e.message}")
    }
}

Pengecualian dengan Penyebab

Teruskan cause untuk mempertahankan pengecualian asli dalam rantai.

class DatabaseError(message: String, cause: Throwable) : Exception(message, cause)
fun main() {
    try {
        try { error("connection refused") }
        catch (e: Throwable) { throw DatabaseError("query failed", e) }
    } catch (e: DatabaseError) {
        println("${e.message} (caused by: ${e.cause?.message})")
    }
}

Checked vs Unchecked

Kotlin memperlakukan semua pengecualian sebagai unchecked (tidak diperlukan deklarasi throws). Berdasarkan konvensi, turunkan dari RuntimeException.

class ValidationException(field: String, message: String) :
    RuntimeException("[$field] $message")
fun main() {
    try {
        throw ValidationException("age", "must be positive")
    } catch (e: ValidationException) {
        println(e.message)
    }
}

Hierarki Pengecualian Domain

Bangun hierarki agar pemanggil dapat menangkap tipe dasar untuk penanganan umum atau subtipe tertentu untuk kasus khusus.

open class AppException(message: String) : RuntimeException(message)
class NotFoundException(what: String) : AppException("$what not found")
class UnauthorizedException : AppException("not authorized")
fun main() {
    val errors = listOf(NotFoundException("user"), UnauthorizedException())
    for (e in errors) {
        try { throw e }
        catch (e: AppException) { println("App error: ${e.message}") }
    }
}

Hierarki Pengecualian Sealed

Untuk himpunan tipe galat yang tertutup, gunakan hierarki sealed—pemanggil dapat menangani setiap varian secara menyeluruh.

sealed class ApiError(message: String) : RuntimeException(message) {
    class Timeout : ApiError("timeout")
    class NotFound(val id: String) : ApiError("not found: $id")
    class ServerError(val status: Int) : ApiError("server returned $status")
}
fun describe(e: ApiError) = when (e) {
    is ApiError.Timeout -> "request timed out"
    is ApiError.NotFound -> "id ${e.id} missing"
    is ApiError.ServerError -> "5xx: ${e.status}"
}
fun main() {
    println(describe(ApiError.NotFound("user-42")))
}

Konvensi Penamaan

Akhiri nama kelas pengecualian kustom dengan Exception atau Error agar jelas. Gunakan bentuk lampau atau kata benda (misalnya NotFound, InvalidInput).

class InvalidInputException(msg: String) : RuntimeException(msg)
class UserNotFoundException(id: Int) : RuntimeException("user $id not found")
fun main() {
    try { throw UserNotFoundException(7) }
    catch (e: UserNotFoundException) { println(e.message) }
}

Mendokumentasikan Pengecualian

Gunakan KDoc @throws untuk mendokumentasikan pengecualian yang mungkin ditimbulkan oleh suatu fungsi.

/**
 * @throws InvalidEmailException if the email is malformed
 */
fun validate(email: String) {
    if ("@" !in email) throw InvalidEmailException("missing @")
}
class InvalidEmailException(m: String) : RuntimeException(m)
fun main() {
    try { validate("nope") }
    catch (e: InvalidEmailException) { println(e.message) }
}

Hindari Penggunaan Pengecualian Secara Berlebihan

Pengecualian ditujukan untuk situasi yang luar biasa. Untuk hasil yang diharapkan (masukan kosong, bidang opsional yang tidak ada), pilih pengembalian nullable, tipe hasil sealed, atau nilai bawaan.

fun findUser(id: Int): String? = if (id == 1) "Alice" else null
fun main() {
    val name = findUser(42) ?: "(unknown)"
    println(name) // (unknown), no exception
}

Contoh Praktis

Pengecualian kustom yang realistis untuk klien API fiktif, dengan status dan isi respons.

class ApiException(
    message: String,
    val statusCode: Int,
    val responseBody: String
) : RuntimeException(message)
fun main() {
    try {
        throw ApiException("Bad Request", 400, "{\"error\":\"invalid\"}")
    } catch (e: ApiException) {
        println("[${e.statusCode}] ${e.message}: ${e.responseBody}")
    }
}

Pemeriksaan Singkat

Kelas induk apa yang paling umum digunakan saat mendefinisikan pengecualian Kotlin khusus domain?

Rangkuman

Pengecualian kustom menyampaikan makna domain. Turunkan dari RuntimeException atau Exception; tambahkan properti untuk konteks; pertahankan penyebab; dan bangun hierarki untuk penangkapan yang dikelompokkan. Gunakan pengecualian sealed untuk himpunan tertutup, dan pilih tipe nullable/hasil ketika galat diharapkan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membuat Class Exception Kustom” gratis?

Ya — teks lengkap “Membuat Class Exception Kustom” 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 “Membuat Class Exception Kustom”?

Definisikan exception khusus domain dengan pesan dan properti yang bermakna. 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 2 dari 4.

Berapa lama pelajaran “Membuat Class Exception Kustom” 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