عوامل معالجة الأخطاء
استعد باستخدام 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 = URLErrorcatch
يعترض 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تحويل التدفقات ودمجها
- المجدولات وتعدد الخيوط
- عوامل معالجة الأخطاء
- الناشرون والمشتركون المخصصون