0Pricing
Kotlin Academy · บทเรียน

runCatching และ Result<T>

ใช้ runCatching ห่อ exception ไว้ใน Result และประมวลผลแบบฟังก์ชัน

runCatching และ Result<T> เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

Result<T> ฉบับย่อ

Result<T> คือส่วนห่อหุ้มผลลัพธ์ของการดำเนินการใน Kotlin ซึ่งอาจเป็นความสำเร็จพร้อมค่าชนิด T หรือความล้มเหลวพร้อม Throwable

พื้นฐานของ runCatching

runCatching { ... } เรียกใช้บล็อกและห่อหุ้มผลลัพธ์ไว้ใน Result

fun main() {
    val good = runCatching { 10 / 2 }
    val bad  = runCatching { 10 / 0 }
    println("good isSuccess = ${good.isSuccess}")
    println("bad isFailure  = ${bad.isFailure}")
}

การดึงค่าออกมา

getOrNull ส่งคืนค่าหรือ null getOrThrow จะโยนข้อยกเว้นอีกครั้งเมื่อล้มเหลว และ getOrDefault จะส่งคืนค่าทางเลือกสำรอง

fun main() {
    val r = runCatching { "42".toInt() }
    println(r.getOrNull())          // 42
    println(r.getOrDefault(-1))    // 42
    val bad = runCatching { "x".toInt() }
    println(bad.getOrNull())       // null
    println(bad.getOrDefault(0))   // 0
}

การดึงข้อยกเว้นออกมา

exceptionOrNull() ส่งคืนข้อยกเว้นเมื่อล้มเหลว หรือส่งคืนค่า null เมื่อสำเร็จ

fun main() {
    val r = runCatching { error("boom") }
    println(r.exceptionOrNull()?.message) // boom
}

การแปลงค่าด้วย map

map { value -> ... } แปลงค่าที่สำเร็จ ส่วนความล้มเหลวจะถูกส่งต่อโดยไม่เปลี่ยนแปลง

fun main() {
    val r = runCatching { "10" }.map { it.toInt() * 2 }
    println(r.getOrNull()) // 20
}

mapCatching

mapCatching ห่อการแปลงค่าไว้ใน try/catch ดังนั้นข้อยกเว้นภายในแลมบ์ดาจึงกลายเป็นความล้มเหลวได้เช่นกัน

fun main() {
    val r = runCatching { "abc" }.mapCatching { it.toInt() }
    println(r.isFailure) // true
    println(r.exceptionOrNull()?.message) // For input string: "abc"
}

recover และ recoverCatching

recover { e -> fallback } เปลี่ยนความล้มเหลวให้เป็นความสำเร็จด้วยการคำนวณค่ากู้คืน

fun main() {
    val r = runCatching { "abc".toInt() }
        .recover { -1 }
    println(r.getOrNull()) // -1
}

onSuccess / onFailure

ใช้ onSuccess และ onFailure สำหรับผลข้างเคียงโดยไม่เปลี่ยนแปลง Result

fun main() {
    runCatching { "42".toInt() }
        .onSuccess { println("parsed: $it") }
        .onFailure { println("failed: ${it.message}") }
}

fold สำหรับทั้งสองเส้นทาง

fold(onSuccess, onFailure) ส่งคืนชนิดเดียวกันจากแขนงใดแขนงหนึ่ง ซึ่งมีประโยชน์เมื่อต้องแปลงเป็นค่าที่พร้อมใช้ในส่วนติดต่อผู้ใช้

fun main() {
    val r = runCatching { "10".toInt() }
    val msg: String = r.fold(
        onSuccess = { "OK: $it" },
        onFailure = { "ERR: ${it.message}" }
    )
    println(msg)
}

การใช้ Result เป็นชนิดส่งคืน

ฟังก์ชันสามารถส่งคืน Result<T> เพื่อทำให้การจัดการข้อผิดพลาดชัดเจน ณ จุดเรียกใช้

fun parseInt(s: String): Result<Int> = runCatching { s.toInt() }
fun main() {
    parseInt("42").onSuccess { println("got $it") }
    parseInt("xx").onFailure { println("oops: ${it.message}") }
}

การเชื่อมการดำเนินการ

รวม runCatching เข้ากับ map mapCatching และ recover เพื่อสร้างกระบวนการจัดการข้อผิดพลาดแบบต่อเนื่อง

fun fetchUserId(): Result<Int> = runCatching { 42 }
fun loadName(id: Int): String = "User-$id"
fun main() {
    val name = fetchUserId()
        .map { loadName(it) }
        .recover { "Anonymous" }
        .getOrNull()
    println(name)
}

ตรวจสอบอย่างรวดเร็ว

ตัวสร้างใดเรียกใช้บล็อกและห่อหุ้มผลลัพธ์ ซึ่งอาจเป็นค่าหรือข้อยกเว้น ไว้ใน Result

สรุปทบทวน

Result<T> แทนความสำเร็จหรือความล้มเหลว สร้างด้วย runCatching แปลงด้วย map/mapCatching กู้คืนด้วย recover ติดตามด้วย onSuccess/onFailure และรวมผลด้วย fold เหมาะอย่างยิ่งสำหรับกระบวนการจัดการข้อผิดพลาดที่ชัดเจน

คำถามที่พบบ่อย

บทเรียน “runCatching และ Result<T>” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “runCatching และ Result<T>” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “runCatching และ Result<T>”

ใช้ runCatching ห่อ exception ไว้ใน Result และประมวลผลแบบฟังก์ชัน คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “runCatching และ Result<T>” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. try/catch/finally ในฐานะนิพจน์
  2. การสร้างคลาส Exception แบบกำหนดเอง
  3. runCatching และ Result
  4. การโยน Exception ซ้ำและการเชื่อมโยง Exception
← กลับไปที่ Kotlin Academy