0Pricing
Scala for Backend Engineering & Functional Programming · درس

قنوات الأخطاء والتبعيات

أخطاء وبيئة ذات أنواع

قنوات الأخطاء والتبعيات درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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.

الأسئلة الشائعة

هل درس «قنوات الأخطاء والتبعيات» مجاني؟

نعم — نص درس «قنوات الأخطاء والتبعيات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

ماذا ستتعلم في «قنوات الأخطاء والتبعيات»؟

أخطاء وبيئة ذات أنواع تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أثر ZIO
  2. تركيب ZIO
  3. قنوات الأخطاء والتبعيات
  4. تشغيل تطبيقات ZIO
← العودة إلى Scala for Backend Engineering & Functional Programming