رمي استثناء
جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 42 من 65.
أحياناً تحتاج إلى إنشاء شروط خطأ خاصة بك في الكود الخاص بك. تسمح لك الكلمة المفتاحية throw بإطلاق استثناء يدوياً عندما يواجه برنامجك موقفاً لا ينبغي السماح له بالاستمرار.
عندما تقوم بـ throw استثناءً، فأنت تقول أساساً "أوقف كل شيء - هناك خطأ ما هنا". هذا مفيد للتحقق من صحة المدخلات أو فرض القواعد في دوالك. يمكنك رمي رسالة نصية بسيطة أو إنشاء أنواع استثناءات أكثر تحديداً.
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
print("Age is valid: $age");
}في هذا المثال، إذا حاول شخص ما تمرير عمر سالب، تقوم الدالة فوراً برمي استثناء مع رسالة وصفية. يمنع هذا بقية الدالة من العمل ببيانات غير صالحة، مما يجعل الكود الخاص بك أكثر موثوقية وأسهل في التصحيح.
يعد رمي الاستثناءات ذا قيمة خاصة في الدوال التي تحتاج إلى التحقق من صحة مدخلاتها قبل المضي قدمًا في تنفيذ عمليات مهمة.
التحدي
سهلقم بإنشاء برنامج يتحقق من صحة معلومات حساب المستخدم من خلال تنفيذ وظائف تحقق مخصصة تطلق استثناءات (exceptions) عند اكتشاف بيانات غير صالحة. يجب أن يقوم برنامجك بفحص حقول حساب متعددة وإطلاق رسائل خطأ محددة لمختلف حالات فشل التحقق.
- اقرأ مدخلاً نصياً يمثل اسم المستخدم (username)
- اقرأ مدخلاً نصياً يمثل عنوان البريد الإلكتروني (email)
- اقرأ مدخلاً نصياً يمثل العمر (age) كسلسلة نصية
- اقرأ مدخلاً نصياً يمثل كلمة المرور (password)
- قم بإنشاء وظيفة تسمى
validateUsernameتتحقق مما إذا كان اسم المستخدم صالحاً: - إذا كان اسم المستخدم فارغاً أو يحتوي على أقل من 3 أحرف، فقم بإطلاق الاستثناء:
"Username must be at least 3 characters long" - إذا كان اسم المستخدم يحتوي على مسافات، فقم بإطلاق الاستثناء:
"Username cannot contain spaces" - إذا نجح التحقق، اطبع:
"Username validation passed" - قم بإنشاء وظيفة تسمى
validateEmailتتحقق مما إذا كان البريد الإلكتروني صالحاً: - إذا كان البريد الإلكتروني لا يحتوي على رمز
@، فقم بإطلاق الاستثناء:"Email must contain @ symbol" - إذا كان البريد الإلكتروني لا يحتوي على نقطة
.بعد رمز@، فقم بإطلاق الاستثناء:"Email must contain a valid domain" - إذا نجح التحقق، اطبع:
"Email validation passed" - قم بإنشاء وظيفة تسمى
validateAgeتتحقق مما إذا كان العمر صالحاً: - قم بتحويل سلسلة العمر النصية إلى عدد صحيح باستخدام
int.parse() - إذا كان العمر أقل من 13، فقم بإطلاق الاستثناء:
"Age must be at least 13 years old" - إذا كان العمر أكبر من 120، فقم بإطلاق الاستثناء:
"Age must be realistic (under 120)" - إذا نجح التحقق، اطبع:
"Age validation passed" - قم بإنشاء وظيفة تسمى
validatePasswordتتحقق مما إذا كانت كلمة المرور صالحة: - إذا كانت كلمة المرور أقصر من 8 أحرف، فقم بإطلاق الاستثناء:
"Password must be at least 8 characters long" - إذا نجح التحقق، اطبع:
"Password validation passed" - قم باستدعاء كل وظيفة تحقق بالتسلسل وتعامل مع أي استثناءات تحدث
- اعرض النتائج بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كانت المدخلات هي "john"، و "john@email.com"، و "25"، و "password123"، يجب أن يخرج برنامجك ما يلي:
Account Validation System
=========================
Validating username: john
Username validation passed
Validating email: john@email.com
Email validation passed
Validating age: 25
Age validation passed
Validating password: password123
Password validation passed
=========================
All validations passed successfully!
Account created for user: johnإذا كانت المدخلات هي "jo"، و "john@email.com"، و "25"، و "password123"، يجب أن يخرج برنامجك ما يلي:
Account Validation System
=========================
Validating username: jo
Validation Error: Username must be at least 3 characters long
Account creation failed due to validation errorsإذا كانت المدخلات هي "john doe"، و "johnemail.com"، و "12"، و "pass"، يجب أن يخرج برنامجك ما يلي:
Account Validation System
=========================
Validating username: john doe
Validation Error: Username cannot contain spaces
Account creation failed due to validation errorsيجب أن يستدعي برنامجك كل وظيفة تحقق بالترتيب الدقيق: اسم المستخدم، ثم البريد الإلكتروني، ثم العمر، ثم كلمة المرور. توقف عن التحقق واعرض رسالة الخطأ بمجرد فشل أي عملية تحقق. استخدم الكلمة المفتاحية throw لإطلاق الاستثناءات يدوياً مع رسائل الخطأ المحددة الموضحة أعلاه. يجب أن تتحقق كل وظيفة تحقق من الحقل الخاص بها وتطلق استثناءً إذا فشل التحقق، أو تطبع رسالة نجاح إذا تم بنجاح.
ورقة مرجعية
تسمح لك الكلمة المفتاحية throw بإطلاق الاستثناءات يدويًا عندما يواجه برنامجك ظروفًا غير صالحة:
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
print("Age is valid: $age");
}عندما تقوم بـ throw استثناء، يتوقف البرنامج عن التنفيذ عند تلك النقطة. هذا مفيد للتحقق من صحة المدخلات وفرض القواعد في الدوال، مما يجعل كودك أكثر موثوقية وأسهل في تصحيح الأخطاء.
يمكنك إطلاق رسائل نصية بسيطة أو إنشاء أنواع استثناءات أكثر تحديدًا. يعد إطلاق الاستثناءات ذا قيمة خاصة في دوال التحقق التي تحتاج إلى فحص المدخلات قبل المتابعة في العمليات الهامة.
جرّب بنفسك
import 'dart:io';
void main() {
// قراءة المدخلات
String? username = stdin.readLineSync();
String? email = stdin.readLineSync();
String? age = stdin.readLineSync();
String? password = stdin.readLineSync();
print("Account Validation System");
print("=========================");
try {
// TODO: قم بإنشاء دالة validateUsername واستدعائها هنا
print("Validating username: $username");
// TODO: قم بإنشاء دالة validateEmail واستدعائها هنا
print("Validating email: $email");
// TODO: قم بإنشاء دالة validateAge واستدعائها هنا
print("Validating age: $age");
// TODO: قم بإنشاء دالة validatePassword واستدعائها هنا
print("Validating password: $password");
// TODO: إذا نجحت جميع عمليات التحقق، اطبع رسائل النجاح
print("=========================");
print("All validations passed successfully!");
print("Account created for user: $username");
} catch (e) {
// TODO: التعامل مع الاستثناءات وطباعة رسالة الخطأ
print("Validation Error: $e");
print("Account creation failed due to validation errors");
}
}
// TODO: اكتب دوال التحقق الخاصة بك هنايتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التعامل المتقدم مع القوائم
خصائص القائمة: first و lastحالة القائمة: isEmpty و isNotEmptyعكس القائمةالإضافة إلى القائمة: insertالحذف من القائمة: removeWhereالبحث في القائمة: indexOfفرز القائمةخلط القائمةملخص - منظم القوائم4معالجة الـ Map المتقدمة
التكرار عبر الـ Mapالتحقق من المفاتيح والقيمخصائص الـ Map: keys و valuesإضافة مشروطة: putIfAbsentإزالة العناصر من الـ Mapالـ Maps المتداخلةمراجعة - تحديث المخزون2عمليات القوائم الوظيفية
التحويل باستخدام 'map'التصفية باستخدام 'where'استخدام '.toList()'التحقق من الشروط باستخدام 'any'الشروط باستخدام 'every'البحث باستخدام 'firstWhere'مراجعة - تصفية البيانات5مشروع: حاسبة عربة التسوق
إعداد المشروعإضافة العناصر إلى العربة3المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة6أساسيات معالجة الأخطاء
ما هي الاستثناءات؟كتلة 'try-catch'التقاط الاستثناءات باستخدام 'on'كتلة 'finally'رمي استثناءملخص - القسمة الآمنة