Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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

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

قد يواجه برنامجك أحيانًا أخطاءً unexpected لا تتوافق مع أنواع exception المحددة التي خططت لها. يوفّر معالج catch الشامل catch(...) شبكة أمان تلتقط أي exception لم تتعامل معها كتل 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;
}

يعمل معالج catch-all كخيار احتياطي لأي نوع من exception لم يتم التقاطه بواسطة blocks السابقة. ويكون هذا مفيدًا بشكل خاص عند التعامل مع تعليمات برمجية قد تحتوي على throw لـ exceptions لم تتوقعها، مما يضمن عدم تعطل برنامجك بسبب أخطاء unexpected.

مع أنه لا يمكنك الوصول إلى التفاصيل المحددة لـ exception داخل كتلة catch-all، فلا يزال بإمكانك تقديم رسالة error عامة وتنفيذ عمليات التنظيف للحفاظ على تشغيل برنامجك بسلاسة.

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
  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++ عبر الإنترنت