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

การจัดการข้อผิดพลาดเชิงฟังก์ชัน

แมปและกู้คืน

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

ข้อผิดพลาดในรูปกระแสข้อมูล

การจัดการข้อผิดพลาดเชิงฟังก์ชันถือว่า failure เป็นค่าที่คุณสามารถแปลง เชื่อมต่อ และกู้คืนได้ เช่นเดียวกับการแปลงค่าที่สำเร็จ ชนิด Result ในตัวมีตัวดำเนินการสำหรับการทำเช่นนี้โดยเฉพาะ

การแปลงค่า

map แปลงค่าที่สำเร็จและปล่อย failure ไว้โดยไม่เปลี่ยนแปลง โดยส่งต่อ failure นั้นไปเหมือนเดิม

fun main() {
    val r = Result.success(5).map { it * 2 }
    println(r.getOrNull())
    val f = Result.failure<Int>(Exception("x")).map { it * 2 }
    println(f.getOrNull())
}

mapCatching

หากการแปลงเองอาจโยนข้อผิดพลาด mapCatching จะจับข้อยกเว้นนั้นไว้ในผลลัพธ์ แทนที่จะปล่อยให้หลุดออกไป

fun main() {
    val r = Result.success("10").mapCatching { it.toInt() }
    println(r.getOrNull())
    val bad = Result.success("oops").mapCatching { it.toInt() }
    println(bad.isFailure)
}

การกู้คืน

recover เปลี่ยน failure กลับเป็น success โดยคำนวณค่าจากข้อยกเว้น ส่วน success จะถูกส่งต่อโดยไม่เปลี่ยนแปลง

fun main() {
    val r = Result.failure<Int>(Exception("down")).recover { 0 }
    println(r.getOrNull())
    val ok = Result.success(7).recover { 0 }
    println(ok.getOrNull())
}

recoverCatching

เมื่อกระบวนการกู้คืนเองก็อาจล้มเหลว recoverCatching จะห่อหุ้มความพยายามนั้นไว้ ทำให้ทุกอย่างยังคงอยู่ในรูปผลลัพธ์

fun main() {
    val r = Result.failure<Int>(Exception()).recoverCatching {
        "5".toInt()
    }
    println(r.getOrNull())
}

onSuccess และ onFailure

ฟังก์ชันเหล่านี้ใช้ดำเนินการผลข้างเคียงโดยไม่เปลี่ยนแปลงผลลัพธ์ และส่งผลลัพธ์นั้นต่อเพื่อเชื่อมโยงการทำงาน เหมาะอย่างยิ่งสำหรับการบันทึกข้อมูลการทำงาน

fun main() {
    runCatching { "3".toInt() }
        .onSuccess { println("ok " + it) }
        .onFailure { println("fail " + it.message) }
        .also { println("done") }
}

การเชื่อมต่อกระบวนการ

ตัวดำเนินการต่าง ๆ สามารถเชื่อมประกอบกันเป็นกระบวนการที่เป็นระเบียบ ได้แก่ การจับผลลัพธ์ การแปลงค่า และการกู้คืน โดยไม่ต้องซ้อน try/catch

fun main() {
    val result = runCatching { "21".toInt() }
        .map { it * 2 }
        .recover { -1 }
        .getOrThrow()
    println(result)
}

fold เป็นค่าผลลัพธ์สุดท้าย

ปิดท้ายกระบวนการด้วย fold เพื่อรวมทั้งสองแขนงให้เป็นค่าที่เป็นรูปธรรมเพียงค่าเดียว เช่น ข้อความที่แสดงต่อผู้ใช้

fun main() {
    val msg = runCatching { "x".toInt() }
        .map { it + 1 }
        .fold(
            onSuccess = { "result: " + it },
            onFailure = { "failed: " + it.message }
        )
    println(msg)
}

การแมปกับชนิดข้อมูลแบบกำหนดเอง

สามารถทำให้ชนิดผลลัพธ์แบบปิดที่กำหนดขึ้นเองใช้งานได้สะดวกในลักษณะเดียวกัน โดยเขียนฟังก์ชันส่วนขยาย เช่น map

sealed class Res<out T> {
    data class Ok<T>(val v: T) : Res<T>()
    data class Err(val msg: String) : Res<Nothing>()
}

fun <T, R> Res<T>.map(f: (T) -> R): Res<R> = when (this) {
    is Res.Ok -> Res.Ok(f(v))
    is Res.Err -> this
}

fun main() {
    val r = Res.Ok(4).map { it * 3 }
    println(r)
}

เหตุผลที่ใช้รูปแบบเชิงฟังก์ชัน

การจัดการข้อผิดพลาดเชิงฟังก์ชันช่วยให้เส้นทางการทำงานปกติอ่านได้ง่าย ขณะที่ข้อผิดพลาดไหลผ่านอย่างเป็นการประกาศ ไม่ต้องกระจาย try/catch ไปทั่ว และระบบชนิดข้อมูลจะติดตามความล้มเหลวตั้งแต่ต้นจนจบ

รวมทุกอย่างเข้าด้วยกัน

ขณะนี้มีชุดเครื่องมือครบถ้วนแล้ว:

  • map / mapCatching สำหรับแปลงค่า
  • recover / recoverCatching สำหรับกู้คืน
  • onSuccess / onFailure สำหรับผลข้างเคียง
  • fold สำหรับสรุปผล

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับการจัดการข้อผิดพลาดเชิงฟังก์ชัน

ทบทวน

ได้เรียนรู้การจัดการข้อผิดพลาดเชิงฟังก์ชัน:

  • แปลงค่าด้วย map / mapCatching
  • กู้คืนด้วย recover / recoverCatching
  • สังเกตผลด้วย onSuccess / onFailure
  • สรุปผลด้วย fold

บทเรียนเรื่อง Result และการจำลองข้อผิดพลาดจบลงเพียงเท่านี้

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

บทเรียน “การจัดการข้อผิดพลาดเชิงฟังก์ชัน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดเชิงฟังก์ชัน”

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

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

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

บทเรียน “การจัดการข้อผิดพลาดเชิงฟังก์ชัน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ชนิดข้อมูล Result
  2. runCatching
  3. ลำดับชั้น Result แบบปิด
  4. การจัดการข้อผิดพลาดเชิงฟังก์ชัน
← กลับไปที่ Kotlin Academy