معالجة الأخطاء في IO
handleError
معالجة الأخطاء في 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لتحويل الخطأ إلىEitherredeem/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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Type Classes في Cats
- Monad الخاص بـIO
- تركيب IO
- معالجة الأخطاء في IO