Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

throws و Error

جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 44 من 56.

تتعامل Swift مع الأخطاء من خلال جعل الدوال تُصرح بأنها قد تفشل. يقوم جسم الدالة برمي قيمة خطأ؛ ويجب على المستدعي معالجتها.

نوع الخطأ هو أي شيء يتوافق مع بروتوكول Error المدمج. وأبسط طريقة للتصريح عن النوع الخاص بك هي باستخدام enum:

enum InputError: Error {
    case empty
    case tooLong
}

تستخدم الدالة التي تثير أخطاء (throwing function) الكلمة المفتاحية throws في توقيعها وعبارة throw في جسمها:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

لا يمكنك استدعاء دالة تثير استثناءً (throwing function) مباشرة، فالمترجم يجبرك على معالجة الخطأ. يوضح الدرس القادم كيفية القيام بذلك.

challenge icon

التحدي

سهل

قم بتعريف enum باسم NumError: Error مع حالتين: negative و tooBig.

قم بتعريف دالة رامية للأخطاء (throwing function) باسم doubleSafely(_ n: Int) throws -> Int تقوم بما يلي:

  • ترمي .negative عندما يكون n < 0
  • ترمي .tooBig عندما يكون n > 100
  • بخلاف ذلك، تعيد n * 2

اقرأ عدداً صحيحاً واحداً من stdin. استدعِ doubleSafely داخل كتلة do/catch (ستتعلم الصيغة الدقيقة في الدرس القادم؛ حالياً استخدم هذا الهيكل تماماً):

do {
    let result = try doubleSafely(n)
    print("ok: \(result)")
} catch NumError.negative {
    print("negative")
} catch NumError.tooBig {
    print("too big")
} catch {
    print("unknown")
}

للمدخل 10 يكون المخرج ok: 20. وللمدخل -1 يكون negative. وللمدخل 500 يكون too big.

ورقة مرجعية

قم بتعريف أنواع الأخطاء باستخدام enum يتوافق مع Error:

enum InputError: Error {
    case empty
    case tooLong
}

قم بتمييز الدالة كدالة رامية للأخطاء باستخدام throws واستخدم throw لإثارة خطأ:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

يجب استدعاء الدوال الرامية للأخطاء مع معالجة الأخطاء (على سبيل المثال do/catch)؛ حيث يفرض المترجم (compiler) ذلك.

جرّب بنفسك

let n = Int(readLine()!)!

// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق والتدفق