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

ช่องทางข้อผิดพลาดและการพึ่งพา

ข้อผิดพลาดแบบมีชนิดและสภาพแวดล้อม

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

ช่องอันทรงพลังสองช่อง

นอกจากค่าผลลัพธ์ที่สำเร็จแล้ว ZIO[R, E, A] ยังติดตามช่องข้อผิดพลาดแบบมีชนิด E และช่องการพึ่งพา R ทั้งสองช่องปรากฏให้เห็นในชนิดข้อมูล ทำให้ความล้มเหลวและข้อกำหนดต่าง ๆ ชัดเจนตั้งแต่เวลาคอมไพล์

ข้อผิดพลาดแบบมีชนิด

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

import zio._

sealed trait AppError
case object NotFound extends AppError
case object Forbidden extends AppError

val lookup: IO[AppError, String] = ZIO.fail(NotFound)

กู้คืนด้วย catchAll

catchAll จัดการข้อผิดพลาดทุกแบบใน E ด้วยการจัดเตรียมเอฟเฟกต์ใหม่ หลังจากนั้นช่องข้อผิดพลาดอาจกลายเป็น Nothing หากจัดการครบทั้งหมดแล้ว

import zio._

val safe: UIO[String] =
  ZIO.fail("boom").catchAll(e => ZIO.succeed(s"recovered: $e"))

catchSome และ orElse

catchSome กู้คืนเฉพาะข้อผิดพลาดที่ตรงตามเงื่อนไข ส่วน orElse จะใช้เอฟเฟกต์อื่นเป็นทางเลือกสำรองเมื่อเกิดความล้มเหลวใด ๆ

import zio._

val prog = ZIO.fail("x").orElse(ZIO.succeed("fallback"))

Either และ fold

either แปลง ZIO[R, E, A] เป็น ZIO[R, Nothing, Either[E, A]] ส่วน fold จัดการทั้งข้อผิดพลาดและผลลัพธ์ที่สำเร็จให้กลายเป็นค่าเดียว

import zio._

val label: UIO[String] =
  ZIO.fail(404).fold(e => s"err $e", v => s"ok $v")

ข้อบกพร่องกับความล้มเหลว

ZIO แยกความแตกต่างระหว่างความล้มเหลว (มีชนิดข้อมูล คาดการณ์ได้ และอยู่ใน E) กับข้อบกพร่อง (ข้อผิดพลาดที่ไม่คาดคิด) ZIO.die ทำให้เกิดข้อบกพร่อง ข้อบกพร่องจะไม่อยู่ในชนิด E และแสดงถึงบั๊กในโปรแกรม

สภาพแวดล้อม R

ช่อง R ประกาศบริการที่เอฟเฟกต์ต้องใช้ เข้าถึงบริการได้ด้วย ZIO.service และข้อกำหนดนั้นจะยังคงปรากฏใน R จนกว่าจะจัดเตรียมบริการให้

import zio._

trait Logger { def log(s: String): UIO[Unit] }

val prog: ZIO[Logger, Nothing, Unit] =
  ZIO.serviceWithZIO[Logger](_.log("hello"))

การกำหนดบริการ

บริการประกอบด้วย trait และ ZLayer ที่ใช้สร้างบริการนั้น เลเยอร์อธิบายวิธีสร้างสิ่งที่ต้องพึ่งพา และตัวเลเยอร์เองก็สามารถพึ่งพาสิ่งอื่นได้

import zio._

case class ConsoleLogger() extends Logger {
  def log(s: String): UIO[Unit] = ZIO.succeed(println(s))
}
object ConsoleLogger {
  val layer: ULayer[Logger] = ZLayer.succeed(ConsoleLogger())
}

trait Logger { def log(s: String): UIO[Unit] }

การจัดเตรียมสิ่งที่ต้องพึ่งพา

provide (หรือ provideLayer) ตอบสนองข้อกำหนด R โดยแปลง ZIO[Logger, E, A] เป็น ZIO[Any, E, A] ซึ่งพร้อมทำงาน

import zio._

val runnable: UIO[Unit] =
  ZIO.serviceWithZIO[Logger](_.log("hi"))
    .provide(ConsoleLogger.layer)

trait Logger { def log(s: String): UIO[Unit] }
object ConsoleLogger { val layer: ULayer[Logger] = ??? }

การประกอบเลเยอร์

เลเยอร์ประกอบในแนวนอนด้วย ++ (รวมกัน) และประกอบในแนวตั้งด้วย >>> (ส่งผลลัพธ์ของเลเยอร์หนึ่งเป็นข้อมูลเข้าให้เลเยอร์ถัดไป) เพื่อสร้างกราฟการพึ่งพาที่สมบูรณ์

import zio._

// val appLayer = configLayer ++ (dbLayer >>> repoLayer)

พื้นฐาน Scala แบบธรรมดา

เพื่อให้เห็นความแตกต่าง ต่อไปนี้คือโปรแกรม Scala ที่มีทุกอย่างอยู่ในตัวและจัดการข้อผิดพลาดด้วยตนเอง ZIO เข้ารหัสข้อผิดพลาดเดียวกันไว้ในชนิดข้อมูล และแทรกสิ่งที่ต้องพึ่งพาผ่านเลเยอร์

object Main {
  def main(args: Array[String]): Unit = {
    val result: Either[String, Int] = Left("NotFound")
    val msg = result.fold(e => s"err $e", v => s"ok $v")
    println(msg)
  }
}

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

เมธอด provide ทำอะไรกับ ZIO[Logger, E, A]

สรุปทบทวน

คุณได้ทำงานกับช่องเพิ่มเติมทั้งสองแบบ:

  • ข้อผิดพลาด: E แบบมีชนิด, catchAll, orElse, fold, ข้อบกพร่องกับความล้มเหลว
  • สิ่งที่ต้องพึ่งพา: R, บริการ, ZLayer, provide, การประกอบเลเยอร์

ถัดไป: การเรียกใช้แอปพลิเคชัน ZIO

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

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

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

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

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

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

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

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

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

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

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

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

  1. เอฟเฟกต์ ZIO
  2. การประกอบ ZIO
  3. ช่องทางข้อผิดพลาดและการพึ่งพา
  4. การเรียกใช้แอป ZIO
← กลับไปที่ Scala for Backend Engineering & Functional Programming