Scala for Backend Engineering & Functional Programming · درس

معالجة الأخطاء في IO

handleError

الدرس 4 من 413 خطوة

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

الأخطاء كقيم

في Cats Effect، يمكن أن يفشل IO. ويُعدّ الفشل جزءًا من القيمة، لذا يمكنك فحصه والتعافي منه دون استخدام try/catch غير المنظّم.

رفع الأخطاء

استخدم IO.raiseError لإنشاء IO فاشل صراحةً مع استثناء تختاره.

import cats.effect.IO

val failed: IO[Int] =
  IO.raiseError(new RuntimeException("boom"))

handleError

تتعافى handleError من IO فاشل عبر توفير قيمة بديلة تُحسب من الخطأ. والنتيجة هي IO لا يمكن أن يفشل في هذه المرحلة.

import cats.effect.IO

val safe: IO[Int] =
  IO.raiseError[Int](new RuntimeException("x"))
    .handleError(_ => -1)

handleErrorWith

تتعافى handleErrorWith باستخدام IO آخر، ولذلك يمكن أن يتضمن البديل نفسه تأثيرًا، مثل التسجيل أو إعادة المحاولة أو إرجاع قيمة افتراضية.

import cats.effect.IO

val recovered: IO[Int] =
  IO(throw new RuntimeException("fail"))
    .handleErrorWith(e => IO.println(s"caught: ${e.getMessage}").as(0))

attempt

تحوّل attempt قيمة IO[A] إلى IO[Either[Throwable, A]]، فتحوّل الخطأ إلى قيمة لتتمكن من إجراء مطابقة الأنماط عليه.

import cats.effect.IO

val e: IO[Either[Throwable, Int]] =
  IO.raiseError[Int](new RuntimeException("oops")).attempt

مطابقة الأنماط مع attempt

بعد استخدام attempt، يمكنك التفرّع بين النجاح والفشل باستخدام flatMap عادي على Either.

import cats.effect.IO

val prog: IO[Unit] = IO(10 / 2).attempt.flatMap {
  case Right(v) => IO.println(s"ok: $v")
  case Left(e)  => IO.println(s"err: ${e.getMessage}")
}

redeem

تعالج redeem الفرعين باستدعاء واحد: دالة للخطأ وأخرى للنجاح، وتعيد كلتاهما قيمة عادية.

import cats.effect.IO

val label: IO[String] =
  IO(42).redeem(e => s"failed: $e", v => s"value: $v")

redeemWith

تشبه redeemWith الدالة redeem، لكن كل فرع يعيد IO، ما يتيح معالجة النجاح والفشل مع تأثيرات.

import cats.effect.IO

val prog: IO[Unit] = IO(42).redeemWith(
  e => IO.println(s"err: $e"),
  v => IO.println(s"got: $v")
)

التنظيف باستخدام guarantee

تنفّذ guarantee عملية الإنهاء سواء نجح التأثير أم فشل — ولذلك فهي مثالية لتحرير الموارد أو تسجيل الإكمال.

import cats.effect.IO

val prog: IO[Int] =
  IO(compute()).guarantee(IO.println("done"))

def compute(): Int = 7

إعادة المحاولة عند الفشل

يمكنك بناء إعادة محاولة بسيطة عبر التعافي تكراريًا باستخدام handleErrorWith، مع إنقاص عدّاد حتى يصل إلى الصفر.

import cats.effect.IO

def retry[A](io: IO[A], n: Int): IO[A] =
  if (n <= 0) io
  else io.handleErrorWith(_ => retry(io, n - 1))

try/catch في Scala العادية

قارن ذلك بمعالجة الأخطاء التقليدية والفورية في Scala العادية. توفّر تركيبات IO الأمان نفسه، لكن على هيئة قيم نقية قابلة للتركيب.

object Main {
  def main(args: Array[String]): Unit = {
    val result = try { 10 / 0 } catch { case _: ArithmeticException => -1 }
    println(s"result: $result")
  }
}

اختبار سريع

ما هي الدالة التي تحوّل IO[A] إلى IO[Either[Throwable, A]]؟

مراجعة

عالجت الأخطاء في IO باستخدام:

  • raiseError للفشل الصريح
  • handleError / handleErrorWith للتعافي
  • attempt لتحويل الخطأ إلى Either
  • redeem / redeemWith لمعالجة الفرعين
  • guarantee للتنظيف

لقد أكملت دورة Cats وIO.

البدء مجانًا

تعلم Scala مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
39
الدروس
143

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

هل درس «معالجة الأخطاء في IO» مجاني؟

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

ماذا ستتعلم في «معالجة الأخطاء في IO»؟

handleError تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟

لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «معالجة الأخطاء في IO»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟

نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

  1. Type Classes في Cats
  2. Monad الخاص بـIO
  3. تركيب IO
  4. معالجة الأخطاء في IO
← العودة إلى Scala for Backend Engineering & Functional Programming