Scala for Backend Engineering & Functional Programming · บทเรียน

การจัดการข้อผิดพลาดใน Futures

ใช้งานแนวทางจัดการข้อยกเว้นและความล้มเหลวภายในการคำนวณแบบอะซิงโครนัสของ `Future` อย่างเหมาะสม

บทเรียน 3 จาก 311 ขั้นตอน

การจัดการข้อผิดพลาดใน Futures เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 3 บทเรียน

การจัดการความล้มเหลวของ Future

การทำงานแบบอะซิงโครนัสอาจล้มเหลวได้! เช่นเดียวกับโค้ดที่ทำงานตามปกติซึ่งอาจส่งข้อยกเว้น Future ก็อาจเสร็จสมบูรณ์พร้อมข้อผิดพลาดแทนค่าที่สำเร็จได้

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

ผลลัพธ์ของ Future: Try

เมื่อ Future ทำงานเสร็จสมบูรณ์ ผลลัพธ์จะถูกห่อหุ้มอยู่ใน scala.util.Try โดย Try นี้อาจเป็น Success(value) หรือ Failure(exception)

  • ความสำเร็จ: เก็บค่าที่คำนวณได้
  • ความล้มเหลว: เก็บข้อยกเว้นที่เกิดขึ้น

การเรียกกลับ onComplete จะได้รับออบเจ็กต์ Try นี้ ทำให้คุณจัดการได้ทั้งสองกรณี

ใช้ onComplete กับข้อผิดพลาด

เมธอด onComplete เป็นตัวรับฟังการเสร็จสมบูรณ์ของ Future แบบครอบคลุม โดยรับฟังก์ชันที่ยอมรับค่า Try[T]

คุณสามารถจับคู่รูปแบบกับ Try เพื่อแยกแยะระหว่างความสำเร็จและความล้มเหลวได้

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Success, Failure}

object Main {
  def main(args: Array[String]): Unit = {
    val failingFuture = Future { 
      if (true) throw new RuntimeException("Oops!")
      10
    }

    failingFuture.onComplete {
      case Success(value) => println(s"Success: $value")
      case Failure(exception) => println(s"Failure: ${exception.getMessage}")
    }

    Thread.sleep(100) // Keep JVM alive for Future to complete
  }
}

เมธอด recover

recover ช่วยให้คุณจัดการข้อยกเว้นและระบุค่าทดแทนหาก Future ล้มเหลว เมธอดนี้จะแปลง Future[T] เป็น Future[T] อีกตัวหนึ่ง

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

ตัวอย่าง recover

ในตัวอย่างนี้ หากเกิดการหารด้วยศูนย์ recover จะดักจับ ArithmeticException และคืนค่า Future ที่มีค่าเป็น 0

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object Main {
  def main(args: Array[String]): Unit = {
    val resultFuture = Future { 10 / 0 } // This will fail

    val recoveredFuture = resultFuture.recover {
      case e: ArithmeticException =>
        println("Caught ArithmeticException, recovering...")
        0 // Fallback value
    }

    recoveredFuture.foreach(value => println(s"Result: $value"))

    Thread.sleep(100) // Keep JVM alive
  }
}

เมธอด recoverWith

recoverWith คล้ายกับ recover แต่แทนที่จะคืนค่าทดแทน จะคืนค่าเป็น Future ทดแทน

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

ตัวอย่าง recoverWith

หาก Future เริ่มต้นล้มเหลว recoverWith จะจัดเตรียม Future ใหม่ที่พยายามทำงานอื่น หรือคืนค่าอะซิงโครนัสเริ่มต้น

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object Main {
  def main(args: Array[String]): Unit = {
    val primaryOperation = Future { 
      if (true) throw new Exception("Primary failed!")
      100
    }

    val fallbackOperation = Future { 
      println("Running fallback operation...")
      50 
    }

    val finalFuture = primaryOperation.recoverWith {
      case e: Exception =>
        println(s"Primary failed: ${e.getMessage}. Using fallback.")
        fallbackOperation
    }

    finalFuture.foreach(value => println(s"Final result: $value"))

    Thread.sleep(200) // Keep JVM alive
  }
}

เมธอด fallbackTo

fallbackTo ช่วยให้คุณเชื่อมโยง Future สองรายการ หาก Future แรกทำงานล้มเหลว ระบบจะไม่สนใจผลลัพธ์ของรายการแรก และใช้ผลลัพธ์ของ Future ที่สองแทน

ต่างจาก recoverWith ตรงที่ fallbackTo จะไม่ตรวจสอบข้อยกเว้น แต่จะทำงานตามแนวคิดว่า "ถ้ารายการนี้ล้มเหลว ให้ลองอีกรายการหนึ่ง"

ตัวอย่าง fallbackTo

ในตัวอย่างนี้ หาก failingFuture ล้มเหลว fallbackTo จะใช้ผลลัพธ์ของ backupFuture

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object Main {
  def main(args: Array[String]): Unit = {
    val failingFuture = Future { 
      if (true) throw new RuntimeException("Network error!")
      "Data from primary"
    }

    val backupFuture = Future { 
      println("Using backup source...")
      "Data from cache"
    }

    val finalResult = failingFuture.fallbackTo(backupFuture)

    finalResult.foreach(value => println(s"Retrieved: $value"))

    Thread.sleep(100) // Keep JVM alive
  }
}

แบบทดสอบการจัดการข้อผิดพลาด

หากต้องการจัดเตรียมการทำงานแบบอะซิงโครนัสทางเลือกเมื่อ Future ล้มเหลว คุณควรใช้เมธอดใดครับ

ทบทวน: การจัดการข้อผิดพลาดของ Future

เราได้สำรวจแนวทางสำคัญสำหรับจัดการข้อผิดพลาดใน Future ของ Scala ดังนี้:

  • onComplete: ตอบสนองทั้งความสำเร็จและความล้มเหลวด้วย Try
  • recover: จัดเตรียมค่าทดแทนเมื่อเกิดข้อยกเว้น
  • recoverWith: จัดเตรียม Future ทดแทนเมื่อเกิดข้อยกเว้น
  • fallbackTo: ใช้ Future สำรองเมื่อรายการหลักล้มเหลว โดยไม่ตรวจสอบข้อผิดพลาด

เมธอดเหล่านี้จำเป็นอย่างยิ่งต่อการสร้างระบบอะซิงโครนัสที่ทนทานต่อความล้มเหลว

เริ่มต้นได้ฟรี

เรียนรู้ Scala ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
143

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

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

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

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

ใช้งานแนวทางจัดการข้อยกเว้นและความล้มเหลวภายในการคำนวณแบบอะซิงโครนัสของ `Future` อย่างเหมาะสม คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

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

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

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

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

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

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

  1. บทนำสู่ Futures และ Promises
  2. การประกอบการดำเนินการแบบอะซิงโครนัส
  3. การจัดการข้อผิดพลาดใน Futures
← กลับไปที่ Scala for Backend Engineering & Functional Programming