0Pricing
Swift Academy · درس

معالجة الأخطاء ورموز حالة HTTP

تحقّقوا من رموز حالة الاستجابة وحوّلوا الأخطاء إلى أخطاء نطاق معيّنة النوع.

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

نطاقات حالات HTTP

تشير استجابات HTTP إلى النجاح أو الفشل عبر رموز الحالة: ‏2xx للنجاح، و3xx لإعادة التوجيه، و4xx لأخطاء العميل، و5xx لأخطاء الخادم.

// 200 OK, 201 Created
// 400 Bad Request, 401 Unauthorized, 404 Not Found
// 500 Internal Server Error

التحقق من الحالة في Swift

حوّل URLResponse إلى HTTPURLResponse وتحقق من statusCode بعد طلب غير متزامن.

let (data, response) = try await URLSession.shared.data(from: url)
guard let http = response as? HTTPURLResponse else {
  throw NetworkError.invalidResponse
}
guard (200..<300).contains(http.statusCode) else {
  throw NetworkError.httpError(http.statusCode)
}

أخطاء الشبكة محددة النوع

عرّف تعداد أخطاء محدد النوع لإخفاقات الشبكة، مما يتيح استخدام كتل catch شاملة.

enum NetworkError: Error {
  case invalidURL
  case invalidResponse
  case httpError(Int)
  case decodingError(Error)
  case noData
}

ربط رموز الحالة بالأخطاء

استخدم switch على رموز الحالة لإصدار أخطاء ذات معنى في المجال بدلًا من أعداد صحيحة خام.

switch http.statusCode {
case 200..<300: break // success
case 401: throw NetworkError.unauthorized
case 404: throw NetworkError.notFound
case 500..<600: throw NetworkError.serverError(http.statusCode)
default: throw NetworkError.httpError(http.statusCode)
}

فك ترميز استجابات الأخطاء

عندما تكون الحالة خطأً، غالبًا ما يحتوي النص الأساسي على رسالة خطأ بتنسيق JSON. فك ترميزها للحصول على تشخيصات أفضل.

if http.statusCode != 200 {
  struct APIError: Decodable { var message: String }
  let apiError = try? JSONDecoder().decode(APIError.self, from: data)
  throw NetworkError.serverMessage(apiError?.message ?? "Unknown error")
}

تمرير الأخطاء في async

يمرر التزامن المنظم في Swift الأخطاء طبيعيًا: إذ يلغي الخطأ المُلقى المهام الشقيقة في TaskGroup.

async let users = fetchUsers()
async let posts = fetchPosts()
let (u, p) = try await (users, posts) // if either throws, both cancel

التقاط أخطاء محددة

استخدم كتل catch محددة النوع للتعامل مع أنواع الأخطاء المختلفة بطرق مميزة في الشيفرة المستدعية.

do {
  let items = try await fetchItems()
} catch NetworkError.unauthorized {
  showLoginScreen()
} catch NetworkError.httpError(let code) {
  print("HTTP Error: \(code)")
} catch {
  print("Unexpected: \(error)")
}

رموز URLError

يصف URLError إخفاقات الاتصال، مثل: .notConnectedToInternet و.timedOut و.cannotFindHost.

do {
  let (data, _) = try await URLSession.shared.data(from: url)
} catch let urlError as URLError where urlError.code == .notConnectedToInternet {
  print("No internet connection")
}

غلاف Result للشبكات

أعد Result من دوال الجلب عندما تريد أن يتعامل المستدعون مع الأخطاء دون استخدام try/catch.

func fetchUser() async -> Result<User, NetworkError> {
  do {
    let user = try await performFetch()
    return .success(user)
  } catch let e as NetworkError {
    return .failure(e)
  } catch {
    return .failure(.unknown)
  }
}

تسجيل الأخطاء

سجّل أخطاء الشبكة مع السياق ذي الصلة، مثل عنوان URL ورمز الحالة والنص الأساسي، لتسهيل تصحيح الأخطاء في بيئة الإنتاج.

func log(_ error: NetworkError, url: URL) {
  print("[Network] \(url.absoluteString) → \(error)")
}

رسائل الأخطاء الموجهة للمستخدم

حوّل الأخطاء التقنية إلى نصوص مفهومة للمستخدم. لا تعرض رموز حالات HTTP الخام في واجهة المستخدم مطلقًا.

extension NetworkError: LocalizedError {
  var errorDescription: String? {
    switch self {
    case .unauthorized: return "Please log in again."
    case .notFound: return "The requested item was not found."
    case .serverError: return "Server error. Please try again later."
    default: return "Something went wrong."
    }
  }
}

تحقق سريع

ما نطاق رمز حالة HTTP الذي يشير إلى استجابة ناجحة؟

مراجعة الدرس

بعد URLSession.data(from:)، حوّل النتيجة إلى HTTPURLResponse وتحقق من statusCode. اربط الرموز بحالات Error محددة النوع. استخدم URLError لإخفاقات الاتصال. مرر الأخطاء باستخدام try/throw والتقطها باستخدام كتل catch محددة النوع.

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

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

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

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

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

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

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

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

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

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

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

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

  1. ‏URLSession data(from:) مع async/await
  2. ‏Codable: ترميز JSON وفك ترميزه
  3. معالجة الأخطاء ورموز حالة HTTP
  4. منطق إعادة المحاولة وURLSession في الخلفية
← العودة إلى Swift Academy