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) مباشرة، فالمترجم يجبرك على معالجة الخطأ. يوضح الدرس القادم كيفية القيام بذلك.
التحدي
سهلقم بتعريف 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 { ... } ...
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلمات