الكلمة المفتاحية 'throw'
جزء من قسم المنطق وتدفق التنفيذ في رحلة 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;
}يضع المستدعي الاستدعاء داخل كتلة try. تكون قيمة السلسلة النصية المُلقاة من النوع const char*، لذا فهذا هو النوع الذي تحدده كتلة catch، ويحتوي معاملها على الرسالة:
try {
checkAge(-5);
} catch (const char* message) {
std::cout << "Error: " << message << 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* للتعامل مع السلاسل النصية الحرفية التي يجري إطلاقها. إذا فشل التحقق الأول، فستطلق الدالة استثناءً ولن تتابع التحقق من الشرط الثاني.
جرّب بنفسك
#include <iostream>
#include <string>
using namespace std;
// TODO: اكتب الدالة validateUser هنا، فوق main
// تستقبل username من النوع string وage من النوع int، وترمي قيمة نصية ثابتة عند فشل أحد التحققات
int main() {
// اقرأ المدخلات
string username;
int age;
getline(cin, username);
cin >> age;
// TODO: استدعِ validateUser داخل كتلة try
// والتقط الرسالة التي تم رميها باستخدام catch (const char* error)
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector5مشروع: أداة المخزون
إعداد المشروعإضافة وتحديث العناصر8أساسيات معالجة الأخطاء
مقدمة في الاستثناءاتكتل 'try' و 'catch'الكلمة المفتاحية 'throw'أنواع الاستثناءات المختلفةمعالج كافة الاستثناءاتمراجعة - القسمة الآمنةتدرّب بنفسك: مترجم C++ عبر الإنترنت