ช่องทางข้อผิดพลาดและการพึ่งพา
ข้อผิดพลาดแบบมีชนิดและสภาพแวดล้อม
ช่องทางข้อผิดพลาดและการพึ่งพา เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เอฟเฟกต์ ZIO
- การประกอบ ZIO
- ช่องทางข้อผิดพลาดและการพึ่งพา
- การเรียกใช้แอป ZIO