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

Option وTry وEither لمعالجة الأخطاء

نفّذ معالجة قوية للأخطاء باستخدام `Option` عند غياب القيمة، و`Try` للاستثناءات، و`Either` لمساري الفشل والنجاح المتميزين

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

معالجة الأخطاء بسلاسة

في البرمجة، لا تسير الأمور دائمًا كما هو مخطط لها. فقد لا تكون الملفات موجودة، أو قد تفشل طلبات الشبكة، أو قد تؤدي الحسابات إلى نتائج غير صالحة.

  • كيف نكتب شيفرة متينة تتعامل مع هذه الحالات بسلاسة؟
  • توفر Scala أدوات قوية لإدارة الأخطاء والقيم المفقودة دون اللجوء إلى `null` أو إطلاق الاستثناءات في كل مكان.

مشكلة Null

تستخدم لغات كثيرة null لتمثيل غياب قيمة. ومع ذلك، تُعد null مصدرًا شائعًا للأخطاء، مثل NullPointerException المخيف.

لا تشجّع Scala على استخدام null. وبدلًا من ذلك، توفر أنواعًا توضّح صراحةً ما إذا كانت القيمة قد تكون مفقودة، مما يجعل الشيفرة أكثر أمانًا وأسهل في الفهم.

التعريف بـ Scala Option

‏Option[A] حاوية يمكنها أن تحتوي إما على قيمة من النوع A (يمثلها Some[A]) أو لا تحتوي على أي قيمة (يمثلها None).

  • تجبركم على مراعاة الحالة التي قد تكون فيها القيمة غائبة.
  • يمنع ذلك استثناءات NullPointerExceptions غير المتوقعة، ويجعل الشيفرة أكثر وضوحًا.

استخدام Option عمليًا: Some وNone

لنرَ كيفية عمل Option. سنعرّف دالة قد تعيد اسمًا أو لا تعيده، وذلك بحسب معرّف.

object Main {
  def findUser(id: Int): Option[String] = {
    if (id == 1) Some("Alice")
    else None
  }

  def main(args: Array[String]): Unit = {
    val user1 = findUser(1) // Some("Alice")
    val user2 = findUser(2) // None

    println(s"User 1: $user1")
    println(s"User 2: $user2")
  }
}

العمل باستخدام Option: map وgetOrElse

يمكنكم تحويل القيمة داخل Option باستخدام map، أو توفير قيمة افتراضية إذا كانت None باستخدام getOrElse.

object Main {
  def findUser(id: Int): Option[String] = {
    if (id == 1) Some("Alice")
    else None
  }

  def main(args: Array[String]): Unit = {
    val userGreeting = findUser(1).map(name => s"Hello, $name!")
    val defaultGreeting = findUser(2).map(name => s"Hello, $name!").getOrElse("Hello, Guest!")

    println(s"User greeting: $userGreeting")
    println(s"Default greeting: $defaultGreeting")
  }
}

التعريف بـ Scala Try

بينما تتعامل Option مع القيم المفقودة، صُمم Try[A] للتعامل مع العمليات الحسابية التي قد تطلق استثناءً.

  • يمكن أن تكون Try إما Success[A] (إذا اكتملت العملية بصورة طبيعية) أو Failure[Throwable] (إذا وقع استثناء).
  • تحتوي الاستثناءات، مما يتيح لكم التعامل معها بأسلوب وظيفي.

استخدام Try عمليًا: Success وFailure

لنعرّف دالة قد تطلق استثناءً (مثل القسمة على صفر)، ونغلّف تنفيذها داخل Try.

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

object Main {
  def divide(a: Int, b: Int): Try[Int] = Try {
    a / b
  }

  def main(args: Array[String]): Unit = {
    val result1 = divide(10, 2) // Success(5)
    val result2 = divide(10, 0) // Failure(java.lang.ArithmeticException: / by zero)

    println(s"Result 1: $result1")
    println(s"Result 2: $result2")
  }
}

العمل باستخدام Try: recover وfold

توفر Try أساليب مثل recover لمعالجة استثناءات محددة، أو fold لمعالجة حالتي النجاح والفشل بوضوح.

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

object Main {
  def parseNumber(s: String): Try[Int] = Try(s.toInt)

  def main(args: Array[String]): Unit = {
    val num1 = parseNumber("123").getOrElse(0)
    val num2 = parseNumber("abc").getOrElse(0)

    val message = parseNumber("456").fold(
      ex => s"Failed to parse: ${ex.getMessage}",
      num => s"Parsed number: $num"
    )

    println(s"Parsed num1: $num1")
    println(s"Parsed num2: $num2")
    println(s"Message: $message")
  }
}

التعريف بـ Scala Either

‏Either[L, R] نوع يمثّل إحدى قيمتين محتملتين. ووفقًا للعرف:

  • تمثّل Left[L] حالة فشل (أو نوع الخطأ L).
  • تمثّل Right[R] حالة نجاح (أو نوع النتيجة R).

وعلى خلاف Try، تتيح لكم Either تحديد نوع ذي معنى للخطأ، وليس مجرد Throwable.

استخدام Either عمليًا: Left وRight

إليكم دالة تتحقق من صحة بريد إلكتروني. فهي تعيد إما رسالة خطأ من النوع String (Left) أو البريد الإلكتروني الذي تم التحقق منه (Right).

object Main {
  def validateEmail(email: String): Either[String, String] = {
    if (email.contains("@") && email.contains(".")) Right(email)
    else Left("Invalid email format")
  }

  def main(args: Array[String]): Unit = {
    val email1 = validateEmail("test@example.com") // Right("test@example.com")
    val email2 = validateEmail("invalid-email")   // Left("Invalid email format")

    println(s"Email 1: $email1")
    println(s"Email 2: $email2")
  }
}

اختبار سريع: معالجة الأخطاء

تكتبون دالة تقرأ قيمة إعداد من خريطة. إذا كان المفتاح موجودًا، تريدون تحويل قيمته النصية إلى عدد صحيح. وإذا كان المفتاح مفقودًا أو فشلت عملية التحويل، تريدون إرجاع القيمة الافتراضية 0.

ما مجموعة أنواع وطرائق Scala الأنسب لهذه المهمة؟

مراجعة: Option وTry وEither

لقد استكشفنا ثلاثة أنواع قوية في Scala لمعالجة الأخطاء بطريقة متينة:

  • Option[A]: للتعامل مع غياب قيمة (Some[A] أو None).
  • Try[A]: لتغليف العمليات التي قد تطلق استثناءات (Success[A] أو Failure[Throwable]).
  • Either[L, R]: لتمثيل نتيجتين متميزتين، عادةً نوع فشل L ونوع نجاح R (Left[L] أو Right[R]).

يجعل استخدام هذه الأنواع شيفرة Scala أكثر أمانًا ووضوحًا ووظيفية!

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

هل درس «Option وTry وEither لمعالجة الأخطاء» مجاني؟

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

ماذا ستتعلم في «Option وTry وEither لمعالجة الأخطاء»؟

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

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

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

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

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

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

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

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

  1. استكشاف معمّق للمجموعات غير القابلة للتغيير
  2. العمليات الوظيفية على المجموعات
  3. Option وTry وEither لمعالجة الأخطاء
← العودة إلى Scala for Backend Engineering & Functional Programming