معالجة الأخطاء في Futures
نفّذ استراتيجيات للتعامل بسلاسة مع الاستثناءات وحالات الفشل ضمن حسابات `Future` غير المتزامنة
معالجة الأخطاء في Futures درس مجاني في 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 دروس في المجموع.
معالجة حالات فشل Future
قد تفشل العمليات غير المتزامنة! فكما يمكن للتعليمات البرمجية المتزامنة طرح استثناءات، يمكن أن يكتمل Future بخطأ بدلًا من قيمة ناجحة.
يُعد فهم كيفية التعامل مع حالات الفشل هذه بطريقة سليمة أمرًا بالغ الأهمية لبناء تطبيقات متزامنة قوية. فمن دون معالجة مناسبة للأخطاء، قد يتعطل البرنامج أو يتصرف على نحو غير متوقع.
نتيجة Future: Try
عند اكتمال Future، تُغلَّف نتيجته داخل scala.util.Try. ويمكن أن تكون قيمة Try هذه إما Success(value) أو Failure(exception).
- Success: تحتوي على القيمة المحسوبة.
- Failure: تحتوي على الاستثناء الذي حدث.
تتلقى دالة الاستدعاء اللاحق onComplete كائن Try هذا، مما يتيح لكم التعامل مع كلتا النتيجتين.
استخدام onComplete لمعالجة الأخطاء
تُعد الدالة onComplete مستمعًا شاملًا لاكتمال Future. وهي تأخذ دالة تقبل قيمة من النوع Try[T].
يمكنكم استخدام مطابقة الأنماط مع Try للتمييز بين النجاح والفشل.
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Success, Failure}
object Main {
def main(args: Array[String]): Unit = {
val failingFuture = Future {
if (true) throw new RuntimeException("Oops!")
10
}
failingFuture.onComplete {
case Success(value) => println(s"Success: $value")
case Failure(exception) => println(s"Failure: ${exception.getMessage}")
}
Thread.sleep(100) // Keep JVM alive for Future to complete
}
}الدالة recover
تتيح لكم recover معالجة استثناء وتوفير قيمة بديلة إذا فشل Future. وهي تحول Future[T] إلى Future[T] آخر.
إذا فشل Future الأصلي، تُطبَّق الدالة الجزئية المقدمة على الاستثناء. وإذا تطابقت معه، يُعاد Future جديد ناجح يحتوي على القيمة البديلة.
مثال على recover
إذا حدثت قسمة على صفر هنا، تلتقط recover الاستثناء ArithmeticException وتعيد Future يحتوي على القيمة 0.
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object Main {
def main(args: Array[String]): Unit = {
val resultFuture = Future { 10 / 0 } // This will fail
val recoveredFuture = resultFuture.recover {
case e: ArithmeticException =>
println("Caught ArithmeticException, recovering...")
0 // Fallback value
}
recoveredFuture.foreach(value => println(s"Result: $value"))
Thread.sleep(100) // Keep JVM alive
}
}الدالة recoverWith
تشبه recoverWith الدالة recover، لكنها بدلًا من إعادة قيمة بديلة تعيد Future بديلًا.
يفيد ذلك عندما يتضمن إجراء المعالجة نفسه عملية غير متزامنة أخرى، أو عندما تريدون إعادة محاولة العملية الأصلية.
مثال على recoverWith
إذا فشل Future الأولي، توفر recoverWith مستقبلًا جديدًا يحاول تنفيذ عملية مختلفة أو قيمة غير متزامنة افتراضية.
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object Main {
def main(args: Array[String]): Unit = {
val primaryOperation = Future {
if (true) throw new Exception("Primary failed!")
100
}
val fallbackOperation = Future {
println("Running fallback operation...")
50
}
val finalFuture = primaryOperation.recoverWith {
case e: Exception =>
println(s"Primary failed: ${e.getMessage}. Using fallback.")
fallbackOperation
}
finalFuture.foreach(value => println(s"Final result: $value"))
Thread.sleep(200) // Keep JVM alive
}
}الدالة fallbackTo
تتيح لكم fallbackTo ربط اثنين من Future. فإذا فشل Future الأول، تُتجاهل نتيجته وتُستخدم نتيجة Future الثاني بدلًا منها.
على خلاف recoverWith، لا تفحص fallbackTo الاستثناء، بل تقول ببساطة: «إذا فشل هذا، فجرّب ذاك».
مثال على fallbackTo
إذا فشل failingFuture هنا، فستستخدم fallbackTo نتيجة backupFuture.
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object Main {
def main(args: Array[String]): Unit = {
val failingFuture = Future {
if (true) throw new RuntimeException("Network error!")
"Data from primary"
}
val backupFuture = Future {
println("Using backup source...")
"Data from cache"
}
val finalResult = failingFuture.fallbackTo(backupFuture)
finalResult.foreach(value => println(s"Retrieved: $value"))
Thread.sleep(100) // Keep JVM alive
}
}اختبار معالجة الأخطاء
ما الدالة التي ستستخدمونها إذا أردتم توفير عملية غير متزامنة بديلة عند فشل Future؟
مراجعة: معالجة أخطاء Future
استكشفنا استراتيجيات أساسية لمعالجة الأخطاء في Future في Scala:
onComplete: تستجيب للنجاح والفشل معًا باستخدامTry.recover: توفر قيمة بديلة عند حدوث استثناء.recoverWith: توفرFutureبديلًا عند حدوث استثناء.fallbackTo: تستخدمFutureاحتياطيًا إذا فشل الأساسي، من دون فحص الخطأ.
تُعد هذه الدوال أساسية لبناء أنظمة غير متزامنة مرنة وقادرة على تحمل الأعطال!
الأسئلة الشائعة
هل درس «معالجة الأخطاء في Futures» مجاني؟
نعم — نص درس «معالجة الأخطاء في Futures» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 3 دروس في المجموع.
ماذا ستتعلم في «معالجة الأخطاء في Futures»؟
نفّذ استراتيجيات للتعامل بسلاسة مع الاستثناءات وحالات الفشل ضمن حسابات `Future` غير المتزامنة تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.
كم من الوقت يستغرق درس «معالجة الأخطاء في Futures»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مقدمة إلى Futures وPromises
- تركيب العمليات غير المتزامنة
- معالجة الأخطاء في Futures