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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- try/catch/finally ในฐานะนิพจน์
- การสร้างคลาส Exception แบบกำหนดเอง
- runCatching และ Result
- การโยน Exception ซ้ำและการเชื่อมโยง Exception