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

Try وSuccess وFailure

معالجة الاستثناءات

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

ما هي Try؟

تمثل Try[T] عملية قد تنتج قيمة أو تطرح استثناءً. ولها نوعان فرعيان:

  • تغلف Success[T] نتيجة عادية.
  • تغلف Failure قيمة من نوع Throwable.

وهي تحوّل الشيفرة التي تطرح استثناءات إلى قيمة يمكن تركيبها.

استيراد Try

توجد Try في scala.util. غلّفوا أي تعبير قد يطرح استثناءً داخل Try { ... }، وستلتقط الاستثناءات غير القاتلة نيابةً عنكم.

import scala.util.Try

@main def run(): Unit = {
  val ok = Try(10 / 2)
  val bad = Try(10 / 0)
  println(ok)
  println(bad)
}

‏Success وFailure

تكون Try التي تكتمل بشكل طبيعي من نوع Success وتحتوي على القيمة؛ أما التي تطرح استثناءً فتصبح من نوع Failure وتحتوي على الاستثناء.

import scala.util.{Try, Success, Failure}

@main def run(): Unit = {
  val result = Try("123".toInt)
  result match {
    case Success(n) => println(s"parsed: $n")
    case Failure(e) => println(s"failed: ${e.getMessage}")
  }
}

مطابقة أنماط حالات الفشل

عندما تطرح الشيفرة المغلّفة استثناءً، يمكنكم فحصه داخل Failure. وهنا يُلتقط تحليل غير صالح بطريقة منظمة.

import scala.util.{Try, Success, Failure}

@main def run(): Unit = {
  val result = Try("abc".toInt)
  result match {
    case Success(n) => println(s"got $n")
    case Failure(e) => println(s"error type: ${e.getClass.getSimpleName}")
  }
}

‏getOrElse مع Try

تعيد getOrElse قيمة النجاح أو قيمة افتراضية عندما تفشل Try. وبذلك تتجنبون طرح الاستثناءات تمامًا.

import scala.util.Try

@main def run(): Unit = {
  val n = Try("oops".toInt).getOrElse(-1)
  println(n)
}

‏map مع Try

تحوّل map قيمة Success. فإذا كانت القيمة الأصلية Failure، أو طرحت دالة التحويل استثناءً، تبقى النتيجة Failure.

import scala.util.Try

@main def run(): Unit = {
  val doubled = Try("21".toInt).map(_ * 2)
  val failed  = Try("x".toInt).map(_ * 2)
  println(doubled)
  println(failed)
}

‏recover: معالجة الاستثناء

تتيح recover تحويل Failure مجددًا إلى Success عبر معالجة استثناءات محددة باستخدام دالة جزئية.

import scala.util.Try

@main def run(): Unit = {
  val safe = Try("x".toInt).recover {
    case _: NumberFormatException => 0
  }
  println(safe)
}

‏recoverWith

تشبه recoverWith الدالة recover، لكن المعالج يعيد قيمة Try أخرى بدلًا من قيمة عادية. استخدموها عندما يكون التعافي نفسه معرضًا للفشل.

import scala.util.Try

@main def run(): Unit = {
  val result = Try("x".toInt).recoverWith {
    case _: NumberFormatException => Try("42".toInt)
  }
  println(result)
}

‏toEither وtoOption

تحوّل Try قيمها بسهولة إلى أنواع أخطاء أخرى:

  • toOption: تصبح Success هي Some، وتصبح Failure هي None.
  • toEither: تصبح Success هي Right، وتصبح Failure هي Left(throwable).
import scala.util.Try

@main def run(): Unit = {
  println(Try("5".toInt).toOption)
  println(Try("x".toInt).toOption)
  println(Try("5".toInt).toEither.isRight)
}

التسلسل باستخدام flatMap

تسلسل flatMap العمليات التي يعيد كلٌّ منها قيمة Try. فإذا فشلت أي خطوة، يتوقف التسلسل بأكمله ويصبح Failure الناتج عن تلك الخطوة.

import scala.util.Try

object Main {
  def half(n: Int): Try[Int] = Try(if (n % 2 == 0) n / 2 else throw new RuntimeException("odd"))

  def main(args: Array[String]): Unit = {
    println(Try("8".toInt).flatMap(half))
    println(Try("7".toInt).flatMap(half))
  }
}

‏Try مقابل try/catch

تحوّل Try الاستثناءات إلى قيم، لذا يمكنكم استخدام map وflatMap ودمج النتائج من دون كتل try/catch متداخلة. وهي تلتقط الاستثناءات غير القاتلة فقط؛ أما الأخطاء الخطيرة مثل OutOfMemoryError فتستمر في الانتشار.

تحقق سريع

اختبروا معرفتكم بـ Try.

مراجعة

لقد تعلّمتم معالجة الاستثناءات باستخدام Try:

  • تلتقط Try { ... } الاستثناءات غير القاتلة في Failure، والنتائج العادية في Success.
  • حوّلوا القيم باستخدام map/flatMap، وتعافوا من الأخطاء باستخدام recover/recoverWith.
  • قدّموا قيمًا افتراضية باستخدام getOrElse.
  • حوّلوا القيم باستخدام toOption وtoEither.

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

هل درس «Try وSuccess وFailure» مجاني؟

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

ماذا ستتعلم في «Try وSuccess وFailure»؟

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

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

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

كم من الوقت يستغرق درس «Try وSuccess وFailure»؟

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

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

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

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

  1. Either لمعالجة الأخطاء
  2. Try وSuccess وFailure
  3. تركيب Either
  4. التحويل بين الأنواع
← العودة إلى Scala for Backend Engineering & Functional Programming