Menu
CoddyTech
flag Ar iconالعربيةdown icon

معالج كافة الاستثناءات

جزء من قسم المنطق وتدفق التنفيذ في رحلة C++ على Coddy. الدرس 52 من 56.

قد يواجه برنامجك أحيانًا أخطاءً غير متوقعة لا تندرج ضمن أنواع الاستثناءات المحددة التي خططت للتعامل معها. يوفر معالج الالتقاط الشامل catch(...) شبكة أمان تلتقط أي استثناء لم تتعامل معه كتل catch الأكثر تحديدًا.

يستخدم معالج الالتقاط الشامل ثلاث نقاط (...) بدلًا من تحديد نوع استثناء معيّن. يجب وضعه بعد جميع كتل catch الأخرى، لأن C++ يفحصها بالترتيب:

try {
    // تعليمة برمجية قد تطرح استثناءات متنوعة
} catch (std::invalid_argument& e) {
    std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
    std::cout << "Number too large!" << std::endl;
} catch (...) {
    std::cout << "An unexpected error occurred!" << std::endl;
}

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

مع أنه لا يمكنك الوصول إلى التفاصيل المحددة للاستثناء داخل كتلة التقاط عامة، فلا يزال بإمكانك عرض رسالة خطأ عامة وإجراء عمليات التنظيف للحفاظ على سير برنامجك بسلاسة.

challenge icon

التحدي

سهل

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

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

  • سلسلة نصية testType تمثّل نوع الاختبار المطلوب تنفيذه ("string_convert" أو "math_operation" أو "array_access" أو "unknown_error")
  • سلسلة نصية value1 ستُستخدم بوصفها البيانات الأساسية للعملية
  • سلسلة نصية value2 ستُستخدم بوصفها بيانات ثانوية لبعض العمليات

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

  1. إنشاء دالة باسم performTest تأخذ ثلاث معاملات من نوع السلسلة النصية
  2. استخدام بنية if-else داخل الدالة للتعامل مع أنواع الاختبارات المختلفة:
  3. إذا كانت قيمة testType هي "string_convert": استخدم std::stoi لتحويل value1 إلى عدد صحيح واطبعه
  4. إذا كانت قيمة testType هي "math_operation": حوّل كلًا من value1 وvalue2 إلى عددين صحيحين باستخدام std::stoi، ثم اقسم value1 على value2 واطبع الناتج
  5. إذا كانت قيمة testType هي "array_access": أنشئ سلسلة نصية "Programming"، وحوّل value1 إلى فهرس عدد صحيح باستخدام std::stoi، ثم استخدم str.at(index) للوصول إلى الحرف عند ذلك الفهرس واطبعه. ترمي الطريقة .at() تلقائيًا الاستثناء std::out_of_range إذا كان الفهرس غير صالح: لا حاجة إلى التحقق اليدوي من الحدود
  6. إذا كانت قيمة testType هي "unknown_error": ارمِ قيمة عدد صحيح 999
  7. استدعِ performTest داخل كتلة try في الدالة main
  8. استخدم عدة كتل catch لمعالجة الاستثناءات بهذا الترتيب المحدد تمامًا:
  9. أولًا: std::invalid_argument& للتحويلات غير الصالحة من سلسلة نصية إلى عدد
  10. ثانيًا: std::out_of_range& للأعداد الكبيرة جدًا أو لفهرس سلسلة نصية خارج الحدود
  11. ثالثًا: catch(...) بوصفه معالج التقاط جميع الاستثناءات لأي أنواع استثناءات أخرى

استخدم تنسيق الإخراج التالي كما هو تمامًا:

للعمليات الناجحة:

Success: [result_value]

لأنواع الاستثناءات المختلفة:

Invalid argument caught
Out of range caught
Unknown exception caught

تذكّر أن معالج التقاط جميع الاستثناءات catch(...) يجب أن يأتي أخيرًا، لأن C++ تتحقق من كتل catch بالترتيب. سيلتقط هذا المعالج أي نوع استثناء لم تتعامل معه كتل catch المحددة السابقة، بما في ذلك استثناء العدد الصحيح الذي يُرمى في حالة "unknown_error". يوفّر معالج التقاط جميع الاستثناءات شبكة أمان للأخطاء غير المتوقعة، مع الاستمرار في إتاحة المعالجة المحددة لأنواع الاستثناءات المعروفة.

جرّب بنفسك

#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;

// TODO: اكتب شيفرتك هنا - أنشئ الدالة performTest

int main() {
    // اقرأ المُدخلات
    string testType;
    string value1;
    string value2;
    
    cin >> testType;
    cin >> value1;
    cin >> value2;
    
    // TODO: اكتب شيفرتك أدناه - نفّذ كتل try-catch واستدعِ performTest
    
    return 0;
}
quiz iconاختبر نفسك

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

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

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