do و try و catch
جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 45 من 56.
الصيغة الكاملة لمعالجة الأخطاء هي do/try/catch:
enum DivError: Error { case byZero }
func divide(_ a: Int, _ b: Int) throws -> Int {
if b == 0 { throw DivError.byZero }
return a / b
}
do {
let r = try divide(10, 2)
print(r) // 5
} catch DivError.byZero {
print("can't divide by zero")
} catch {
print("unknown error")
}توضع try أمام أي استدعاء يرمي خطأ (throwing call). إذا قام الاستدعاء برمي خطأ، ينتقل التحكم إلى catch المطابقة؛ وبخلاف ذلك، يستمر التنفيذ متجاوزاً كتلة do.
تعمل عبارات catch المتعددة من الأعلى إلى الأسفل وتفوز أول مطابقة، تماماً مثل switch. عبارة catch المجردة في النهاية هي التي تلتقط كل شيء، وستحتاج إليها دائماً تقريباً لإبقاء المترجم (compiler) راضياً.
التحدي
سهلقم بتعريف enum باسم ParseError: Error بثلاث حالات: empty، و notInteger، و negative.
قم بتعريف دالة قابلة لرمي الأخطاء (throwing function) باسم parsePositive(_ s: String) throws -> Int تقوم بما يلي:
- ترمي
.emptyعندما يكونsفارغاً بعد إزالة المسافات البيضاء - ترمي
.notIntegerعندما لا يمكن تحليلsكـInt - ترمي
.negativeعندما تكون القيمة المحللة< 0 - خلاف ذلك، تعيد القيمة المحللة
اقرأ سطراً واحداً من stdin واستدعِ parsePositive داخل كتلة do/catch. اطبع:
got: <n>عند النجاحerror: empty، أوerror: not integer، أوerror: negativeلكل حالة خطأ
بالنسبة للمدخل 42، يكون المخرج got: 42. وللسطر الفارغ، يكون error: empty. وللمدخل abc يكون error: not integer.
جرّب بنفسك
let line = readLine()!
// مهام: enum ParseError; func parsePositive(_:) throws -> Int;
// do/try/catch مع ثلاثة فروع بالإضافة إلى الفرع الشامل (catch-all)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلمات