الكلمة المفتاحية 'throw'
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 50 من 56.
في بعض الأحيان تحتاج إلى الإشارة إلى وقوع خطأ في الكود الخاص بك، بدلاً من مجرد التقاط الاستثناءات التي يتم طرحها بواسطة دوال أخرى. تسمح لك الكلمة المفتاحية throw بإطلاق استثناء يدويًا عندما يكتشف برنامجك مشكلة ما.
يمكنك رمي أنواع مختلفة من القيم كاستثناءات - أعداد صحيحة، أو سلاسل نصية، أو حتى كائنات مخصصة. إليك الصيغة الأساسية:
if (someErrorCondition) {
throw "Error message"; // يرمي سلسلة نصية ثابتة
}عندما تستخدم throw، يتوقف البرنامج فوراً عن تنفيذ الدالة الحالية ويبحث عن كتلة catch يمكنها معالجة القيمة التي تم رميها. هذا مفيد بشكل خاص للتحقق من صحة المدخلات أو فحص الشروط التي لا ينبغي أن تحدث أثناء التنفيذ العادي للبرنامج.
إليك مثال عملي على رمي استثناء عند اكتشاف إدخال غير صالح:
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
std::cout << "Age is valid: " << age << std::endl;
}تمنحك الكلمة المفتاحية throw التحكم في متى وكيف يتم الإبلاغ عن الأخطاء في برامجك، مما يجعل دوالك أكثر قوة وقابلية للتنبؤ عند التعامل مع الظروف غير الصالحة.
التحدي
سهلقم بإنشاء برنامج ينفذ التحقق من صحة المدخلات باستخدام الكلمة المفتاحية throw لإطلاق الاستثناءات يدويًا عند اكتشاف شروط غير صالحة. سيختبر هذا التحدي فهمك لكيفية استخدام throw للإشارة إلى الأخطاء في دوالك الخاصة.
سيتم توفير المدخلات التالية:
- سلسلة نصية
usernameتمثل اسم المستخدم الذي اختاره المستخدم - عدد صحيح
ageيمثل عمر المستخدم
يجب على برنامجك القيام بما يلي:
- إنشاء دالة باسم
validateUserتأخذ سلسلة نصية وعددًا صحيحًا كمعاملات - داخل الدالة، تحقق مما إذا كان اسم المستخدم فارغًا (طوله 0)
- إذا كان اسم المستخدم فارغًا، قم بـ
throwللسلسلة النصية"Username cannot be empty" - تحقق مما إذا كان العمر أقل من 13
- إذا كان العمر أقل من 13، قم بـ
throwللسلسلة النصية"Age must be at least 13" - إذا نجحت كلتا عمليتي التحقق، اطبع
"User validation successful" - في الدالة الرئيسية، استدعِ
validateUserمع قيم المدخلات - استخدم كتلة
tryلاستدعاء الدالة وكتلةcatchللتعامل مع أي استثناءات نصية يتم إطلاقها
استخدم تنسيق المخرجات الدقيق التالي:
للتحقق الناجح:
User validation successfulلأخطاء التحقق:
Validation error: [error_message]تذكر أنه عندما تستخدم throw، يتوقف البرنامج فورًا عن تنفيذ الدالة الحالية ويبحث عن كتلة catch مطابقة. يجب أن تحدد كتلة catch النوع const char* للتعامل مع النصوص (string literals) التي تم إطلاقها. إذا فشل التحقق الأول، فستقوم الدالة بإطلاق استثناء ولن تستمر في التحقق من الشرط الثاني.
ورقة مرجعية
تسمح لك الكلمة المفتاحية throw بإطلاق الاستثناءات يدويًا عندما يكتشف برنامجك مشكلة ما:
if (someErrorCondition) {
throw "Error message"; // يطلق سلسلة نصية ثابتة
}عندما تستخدم throw، يتوقف البرنامج فورًا عن تنفيذ الدالة الحالية ويبحث عن كتلة catch يمكنها معالجة القيمة التي تم إطلاقها.
مثال على إطلاق استثناء للتحقق من صحة المدخلات:
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
std::cout << "Age is valid: " << age << std::endl;
}يمكنك إطلاق أنواع مختلفة من القيم كاستثناءات - أعداد صحيحة، أو سلاسل نصية، أو كائنات مخصصة. استخدم const char* في كتل catch لمعالجة السلاسل النصية الثابتة التي يتم إطلاقها.
جرّب بنفسك
#include <iostream>
#include <string>
using namespace std;
int main() {
// قراءة المدخلات
string username;
int age;
cin >> username;
cin >> age;
// TODO: اكتب كودك هنا
// قم بإنشاء دالة validateUser وتنفيذ منطق التحقق
// استخدم كتل try-catch للتعامل مع الاستثناءات
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector5مشروع: أداة المخزون
إعداد المشروعإضافة وتحديث العناصر8أساسيات معالجة الأخطاء
مقدمة في الاستثناءاتكتل 'try' و 'catch'الكلمة المفتاحية 'throw'أنواع الاستثناءات المختلفةمعالج كافة الاستثناءاتمراجعة - القسمة الآمنة