معالج كافة الاستثناءات
جزء من قسم المنطق وتدفق التنفيذ في رحلة 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;
}يعمل معالج الالتقاط الشامل كخيار احتياطي لأي نوع من الاستثناءات لم تلتقطه الكتل السابقة. ويكون هذا مفيدًا بشكل خاص عند العمل على شيفرة قد تطرح استثناءات لم تتوقعها، مما يضمن ألا يتعطل برنامجك بسبب أخطاء غير متوقعة.
مع أنه لا يمكنك الوصول إلى التفاصيل المحددة للاستثناء داخل كتلة التقاط عامة، فلا يزال بإمكانك عرض رسالة خطأ عامة وإجراء عمليات التنظيف للحفاظ على سير برنامجك بسلاسة.
التحدي
سهلأنشئ برنامجًا يوضّح المعالجة الشاملة للاستثناءات باستخدام عدة كتل 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في الدالة main - استخدم عدة كتل
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++ عبر الإنترنت