0Pricing
Kotlin Academy · درس

‏runCatching وResult<T>

استخدم runCatching لتغليف الاستثناءات داخل Result ومعالجتها بأسلوب وظيفي.

‏runCatching وResult<T> درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

Result<T> باختصار

‏Result<T> هو غلاف في Kotlin لنتيجة عملية ما: إما نجاح مع قيمة من النوع T، أو فشل مع Throwable.

أساسيات runCatching

تنفذ runCatching { ... } الكتلة وتغلف النتيجة في Result.

fun main() {
    val good = runCatching { 10 / 2 }
    val bad  = runCatching { 10 / 0 }
    println("good isSuccess = ${good.isSuccess}")
    println("bad isFailure  = ${bad.isFailure}")
}

استخراج القيمة

تعيد getOrNull القيمة أو null. ويعيد getOrThrow إطلاق الاستثناء عند الفشل. أما getOrDefault فتعيد قيمة بديلة.

fun main() {
    val r = runCatching { "42".toInt() }
    println(r.getOrNull())          // 42
    println(r.getOrDefault(-1))    // 42
    val bad = runCatching { "x".toInt() }
    println(bad.getOrNull())       // null
    println(bad.getOrDefault(0))   // 0
}

استخراج الاستثناء

تعيد exceptionOrNull() الاستثناء عند الفشل، أو null عند النجاح.

fun main() {
    val r = runCatching { error("boom") }
    println(r.exceptionOrNull()?.message) // boom
}

التحويل باستخدام map

يحوّل map { value -> ... } قيمة النجاح. ويمرر الفشل دون تغيير.

fun main() {
    val r = runCatching { "10" }.map { it.toInt() * 2 }
    println(r.getOrNull()) // 20
}

mapCatching

يغلّف mapCatching التحويل داخل try/catch، ولذلك تتحول الاستثناءات التي تحدث داخل lambda إلى حالات فشل أيضًا.

fun main() {
    val r = runCatching { "abc" }.mapCatching { it.toInt() }
    println(r.isFailure) // true
    println(r.exceptionOrNull()?.message) // For input string: "abc"
}

recover وrecoverCatching

يحوّل recover { e -> fallback } حالات الفشل إلى حالات نجاح من خلال حساب قيمة للتعافي.

fun main() {
    val r = runCatching { "abc".toInt() }
        .recover { -1 }
    println(r.getOrNull()) // -1
}

onSuccess / onFailure

استخدم onSuccess وonFailure لتنفيذ آثار جانبية دون تغيير Result.

fun main() {
    runCatching { "42".toInt() }
        .onSuccess { println("parsed: $it") }
        .onFailure { println("failed: ${it.message}") }
}

fold للمسارين

يعيد fold(onSuccess, onFailure) نوعًا موحدًا من أي من الفرعين، وهو مفيد للتحويل إلى قيمة جاهزة لواجهة المستخدم.

fun main() {
    val r = runCatching { "10".toInt() }
    val msg: String = r.fold(
        onSuccess = { "OK: $it" },
        onFailure = { "ERR: ${it.message}" }
    )
    println(msg)
}

استخدام Result كنوع إرجاع

يمكن للدوال إرجاع Result<T> لجعل معالجة الأخطاء واضحة في موضع الاستدعاء.

fun parseInt(s: String): Result<Int> = runCatching { s.toInt() }
fun main() {
    parseInt("42").onSuccess { println("got $it") }
    parseInt("xx").onFailure { println("oops: ${it.message}") }
}

تسلسل العمليات

ادمج runCatching مع map وmapCatching وrecover لإنشاء مسارات معالجة أخطاء سلسة.

fun fetchUserId(): Result<Int> = runCatching { 42 }
fun loadName(id: Int): String = "User-$id"
fun main() {
    val name = fetchUserId()
        .map { loadName(it) }
        .recover { "Anonymous" }
        .getOrNull()
    println(name)
}

تحقق سريع

أي منشئ ينفذ كتلة ويغلف نتيجتها، سواء كانت قيمة أو استثناءً، في Result؟

مراجعة

يمثل Result<T> النجاح أو الفشل. أنشئه باستخدام runCatching، وحوّله باستخدام map/mapCatching، وتعافَ باستخدام recover، وراقبه باستخدام onSuccess/onFailure، واختصره باستخدام fold. وهو مناسب جدًا لمسارات معالجة الأخطاء الواضحة.

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

هل درس «‏runCatching وResult<T>» مجاني؟

نعم — نص درس «‏runCatching وResult<T>» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏runCatching وResult<T>»؟

استخدم runCatching لتغليف الاستثناءات داخل Result ومعالجتها بأسلوب وظيفي. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «‏runCatching وResult<T>»؟

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

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

  1. ‏try/catch/finally كتعبير
  2. إنشاء أصناف Exception مخصصة
  3. ‏runCatching وResult
  4. إعادة رمي الاستثناءات وتسلسلها
← العودة إلى Kotlin Academy