0Pricing
Swift Academy · درس

عوامل معالجة الأخطاء

استعد باستخدام catch و retry و replaceError.

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

الأخطاء في Combine

تحتوي ناشرات Combine على نوع Failure. وعندما يفشل ناشر، ينهي التدفق — فلا تُصدر أي قيم أخرى. ولإنشاء خطوط معالجة متينة، تحتاج إلى مشغلات تتعامل مع الأخطاء أو تحوّلها أو تتعافى منها.

نوع Failure

يعلن كل ناشر عن Output وFailure. ولا يُترجم خط المعالجة إلا عندما تتوافق أنواع الأخطاء، ولذلك تنتشر المشغلات التي تغيّر الأخطاء.

let publisher: AnyPublisher<Data, URLError> = apiClient.request()
// Output = Data, Failure = URLError

catch

يعترض catch حالة الفشل ويستبدل الناشر الفاشل بآخر جديد. وهذا يتيح لك توفير قيم بديلة عند حدوث خطأ ما.

apiClient.fetchUser()
    .catch { error in
        Just(User.guest)
    }
    .sink { user in
        print("Got", user.name)
    }
    .store(in: &cancellables)

replaceError

يُعد replaceError(with:) صيغة أبسط من catch: إذ يستبدل أي فشل بقيمة بديلة واحدة وينهي التدفق بنجاح.

apiClient.fetchCount()
    .replaceError(with: 0)
    .sink { count in
        self.badge.text = "\(count)"
    }
    .store(in: &cancellables)

retry

يعيد retry(n) الاشتراك في المنبع بحد أقصى n مرات عند فشله. وهو مناسب لأخطاء الشبكة المؤقتة.

apiClient.fetchData()
    .retry(3)
    .sink(receiveCompletion: { print($0) },
          receiveValue: { print($0) })
    .store(in: &cancellables)

الجمع بين retry وcatch

نمط شائع لبناء تدفق مرن: استخدم retry عدة مرات، ثم استخدم catch للانتقال إلى خيار احتياطي إذا فشلت جميع المحاولات.

apiClient.fetchData()
    .retry(2)
    .catch { _ in
        Just(Data())
    }
    .sink { data in
        self.process(data)
    }
    .store(in: &cancellables)

mapError

يحوّل mapError نوعًا من الأخطاء إلى نوع آخر. وهذا ضروري لتوحيد حالات الفشل المختلفة القادمة من المصادر السابقة ضمن نوع خطأ واحد على مستوى التطبيق.

enum AppError: Error { case network }

apiClient.request()
    .mapError { _ in AppError.network }
    .sink(receiveCompletion: { _ in }, receiveValue: { _ in })
    .store(in: &cancellables)

أهمية mapError

عند دمج الناشرين، يجب أن تتطابق أنواع Failure لديهم. يعمل mapError على توحيد الأخطاء غير المتطابقة، بحيث تُترجم مشغلات مثل merge وzip بنجاح، ويتعامل sink مع نوع واحد من الأخطاء.

setFailureType

تمتلك بعض الناشرين، مثل Just، نوع فشل هو Never. تعمل setFailureType(to:) كجسر يتيح دمجها مع الناشرين الذين يمكن أن يفشلوا.

Just(42)
    .setFailureType(to: AppError.self)
    .merge(with: failablePublisher)
    .sink(receiveCompletion: { _ in }, receiveValue: { _ in })
    .store(in: &cancellables)

معالجة الاكتمال

في sink، تخبرك دالة الإغلاق الخاصة بالاكتمال بما إذا كان التدفق قد انتهى أم فشل. افحصها للاستجابة للأخطاء التي لم تتم معالجتها في المراحل السابقة من التدفق.

publisher.sink(
    receiveCompletion: { completion in
        if case .failure(let error) = completion {
            self.showAlert(error)
        }
    },
    receiveValue: { value in
        self.update(value)
    }
).store(in: &cancellables)

تصميم مسارات معالجة مرنة

أفضل الممارسات لمعالجة الأخطاء:

  • استخدم retry مع حالات الفشل المؤقتة
  • استخدم catch أو replaceError لتوفير خيارات احتياطية
  • استخدم mapError لتوحيد أنواع الأخطاء
  • عالج دائمًا حالة الفشل في sink

اختبار سريع

اختبر معرفتك بمعالجة الأخطاء.

مراجعة

لقد تعلمت مشغلات Combine لمعالجة الأخطاء:

  • catch / replaceError — لتوفير خيارات احتياطية
  • retry — لإعادة المحاولة عند الفشل
  • mapError / setFailureType — لتوحيد أنواع الأخطاء

تتيح لك هذه المشغلات معًا بناء مسارات تتعامل مع الأعطال بسلاسة بدلًا من التوقف عند أول خطأ.

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

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

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

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

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

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

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

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

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

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

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

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

  1. تحويل التدفقات ودمجها
  2. المجدولات وتعدد الخيوط
  3. عوامل معالجة الأخطاء
  4. الناشرون والمشتركون المخصصون
← العودة إلى Swift Academy