Scala for Backend Engineering & Functional Programming · 课时

Future 中的错误处理

学习在异步 `Future` 计算中优雅地处理异常和失败的策略。

第 3 / 3 课11 个步骤

Future 中的错误处理 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 3 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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)。

  • Success:包含计算得到的值。
  • Failure:包含发生的异常。

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,并返回一个值为 0 的 Future。

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 错误处理

我们已经探讨了 Scala Future 中处理错误的关键策略:

  • onComplete:通过 Try 对成功和失败都做出响应。
  • recover:发生异常时提供备用值。
  • recoverWith:发生异常时提供备用的 Future。
  • fallbackTo:当主要 Future 失败时使用备用 Future,而不会检查错误。

这些方法对于构建具有弹性的异步系统至关重要!

免费开始

用 AI 导师学习 Scala — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
143

常见问题解答

「Future 中的错误处理」课时是免费的吗?

是的 — 「Future 中的错误处理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 3 节课。

「Future 中的错误处理」这节课中我会学到什么?

学习在异步 `Future` 计算中优雅地处理异常和失败的策略。 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 3 节。

「Future 中的错误处理」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?

能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Future 与 Promise 入门
  2. 组合异步操作
  3. Future 中的错误处理
← 返回 Scala for Backend Engineering & Functional Programming