أمان الاستثناءات
اكتب تعليمات برمجية آمنة مع الاستثناءات
أمان الاستثناءات درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا يعني أمان الاستثناءات؟
يصف أمان الاستثناءات الضمانات التي يحافظ عليها كودك عند رمي استثناء في منتصف العملية.
ضمان عدم الرمي
أقوى المستويات: العملية لا ترمي استثناءً أبدًا. وينبغي أن تستهدف المُخرّبات وعمليات التبديل والنقل هذا المستوى، وأن تحمل وسم noexcept.
الضمان القوي
إذا رمت العملية استثناءً، تعود حالة البرنامج إلى ما كانت عليه، كما لو أنها لم تبدأ قط — أي دلالات التنفيذ أو التراجع.
الضمان الأساسي
إذا رمت العملية استثناءً، فلا تتسرب أي موارد وتظل جميع الثوابت محققة، رغم أن الحالة الدقيقة قد تكون تغيرت.
انعدام الضمان
أضعف المستويات: قد يترك الاستثناء البرنامج في حالة تالفة أو تتسرب منها الموارد. تجنب كتابة مثل هذا الكود.
يوفّر RAII الضمان الأساسي
بإحاطة الموارد داخل كائنات RAII، يحرّرها فك مكدس الاستدعاءات تلقائيًا — فتحصل على الضمان الأساسي مجانًا تقريبًا.
#include <memory>
#include <stdexcept>
void process() {
auto buf = std::make_unique<int[]>(100); // freed even if throw
throw std::runtime_error("oops"); // no leak
}النسخ والتبديل لأمان قوي
إحدى التقنيات الشائعة هي تنفيذ كل العمل المحفوف بالمخاطر على نسخة، ثم إجراء swap لإدخالها. وتكون عملية التبديل غير قابلة للرمي، لذا يصبح التغيير كليًا أو لا يحدث.
void assign(Widget& target, const Widget& src) {
Widget tmp = src; // may throw, target untouched
using std::swap;
swap(target, tmp); // no-throw commit
}رتّب العمليات واجعل الالتزام أخيرًا
نفّذ كل عملية يمكن أن ترمي استثناءً قبل أي تغيير لا يمكن التراجع عنه. وبمجرد البدء في تعديل الحالة المشتركة، ينبغي ألا يعود الفشل ممكنًا.
احذر التحديثات الجزئية
يؤدي تحديث عضوين يمكن للثاني منهما أن يرمي استثناءً إلى ترك الكائن في حالة غير متسقة. جهّز كليهما، ثم نفّذ الالتزام بهما مع خطوات لا ترمي استثناءات.
يجب ألا ترمي المُخرّبات استثناءات
يؤدي المُخرّب الذي يرمي استثناءً أثناء فك المكدس إلى استدعاء std::terminate. اجعل المُخرّبات غير قابلة للرمي للحفاظ على ضمانات الأمان.
اختيار الضمان
استهدف الضمان القوي حيثما كان ذلك ممكنًا، ووفّر دائمًا الضمان الأساسي على الأقل، وضع وسم noexcept للعمليات غير القابلة للرمي فعلًا.
تحقق سريع
اختبر فهمك لأمان الاستثناءات.
مراجعة
تعلّمت المستويات الأربعة لـأمان الاستثناءات: عدم الرمي، والقوي، والأساسي، وانعدام الضمان. يوفّر RAII الضمان الأساسي تلقائيًا؛ ويمنح النسخ والتبديل والالتزام الأخير الضمان القوي. اجعل المُخرّبات وعمليات التبديل غير قابلة للرمي.
الأسئلة الشائعة
هل درس «أمان الاستثناءات» مجاني؟
نعم — نص درس «أمان الاستثناءات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «أمان الاستثناءات»؟
اكتب تعليمات برمجية آمنة مع الاستثناءات تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «أمان الاستثناءات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- try وcatch وthrow
- أمان الاستثناءات
- محدّد noexcept
- أنواع الاستثناءات المخصّصة