Menu
CoddyTech

الكلمة المفتاحية '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 التحكم في وقت الإبلاغ عن الأخطاء في برامجك وكيفيته، مما يجعل دوالك أكثر متانة وقابلية للتنبؤ عند التعامل مع الحالات غير الصالحة.

challenge icon

التحدي

سهل

أنشئ برنامجًا ينفّذ التحقق من صحة المدخلات باستخدام الكلمة المفتاحية throw لإطلاق الاستثناءات يدويًا عند اكتشاف شروط غير صالحة. سيختبر هذا التحدي فهمك لكيفية استخدام throw للإشارة إلى الأخطاء في دوالك الخاصة.

ستُقدَّم المدخلات التالية:

  • سلسلة نصية username تمثّل اسم المستخدم الذي اختاره المستخدم (قد يكون هذا السطر فارغًا)
  • عدد صحيح age يمثّل عمر المستخدم

ينبغي لبرنامجك أن:

  1. ينشئ دالة باسم validateUser تأخذ سلسلة نصية وعددًا صحيحًا كوسيطين
  2. يتحقق داخل الدالة مما إذا كان اسم المستخدم فارغًا (طوله 0)
  3. إذا كان اسم المستخدم فارغًا، يطلق throw السلسلة النصية "Username cannot be empty"
  4. يتحقق مما إذا كان العمر أقل من 13
  5. إذا كان العمر أقل من 13، يطلق throw السلسلة النصية "Age must be at least 13"
  6. إذا اجتاز كلا التحققين، يطبع "User validation successful"
  7. يستدعي validateUser في الدالة الرئيسية باستخدام قيم الإدخال
  8. يستخدم كتلة 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;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم C++ عبر الإنترنت