معالج كافة الاستثناءات
جزء من قسم المنطق وتدفق التنفيذ في رحلة 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 عامة وتنفيذ عمليات التنظيف للحفاظ على تشغيل برنامجك بسلاسة.
التحدي
سهلأنشئ برنامجًا يوضّح التعامل الشامل مع الاستثناءات باستخدام عدة كتل catch، بما في ذلك معالج شامل لجميع الحالات. سيتحقق هذا التحدي من فهمك لكيفية التعامل مع أنواع الاستثناءات المحددة والأخطاء غير المتوقعة التي لا تندرج ضمن الفئات المحددة مسبقًا.
سيتم توفير المدخلات التالية:
- سلسلة نصية
testTypeتمثل نوع الاختبار المطلوب إجراؤه ("string_convert"أو"math_operation"أو"array_access"أو"unknown_error") - سلسلة نصية
value1ستُستخدم كبيانات أساسية للعملية - سلسلة نصية
value2ستُستخدم كبيانات ثانوية لبعض العمليات
يجب أن يقوم برنامجك بما يلي:
- أنشئ دالة باسم
performTestتأخذ ثلاثة معاملات نصية - داخل الدالة، استخدم بنية if-else للتعامل مع أنواع الاختبارات المختلفة:
- إذا كان testType هو
"string_convert": استخدمstd::stoiلتحويل value1 إلى عدد صحيح وطباعته - إذا كان testType هو
"math_operation": حوّل كلًا من value1 وvalue2 إلى أعداد صحيحة باستخدامstd::stoi، ثم اقسم value1 على value2 واطبع النتيجة - إذا كان testType هو
"array_access": أنشئ سلسلة نصية"Programming"، وحوّل value1 إلى فهرس صحيح باستخدامstd::stoi، ثم استخدمstr.at(index)للوصول إلى الحرف الموجود عند ذلك الفهرس وطباعته. ترمي الطريقة.at()تلقائيًاstd::out_of_rangeإذا كان الفهرس غير صالح؛ ولا حاجة إلى إجراء فحص يدوي للحدود - إذا كان testType هو
"unknown_error": اطرح قيمة عددية صحيحة999 - في الدالة الرئيسية، استدعِ
performTestداخل كتلةtry - استخدم عدة كتل
catchلمعالجة الاستثناءات بالترتيب التالي بالضبط: - أولًا:
std::invalid_argument&لتحويلات السلاسل النصية إلى أعداد غير الصالحة - ثانيًا:
std::out_of_range&للأعداد الكبيرة جدًا أو لفهرس السلسلة النصية الواقع خارج الحدود - ثالثًا:
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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
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++ عبر الإنترنت