0Pricing
C++ Academy · درس

try وcatch وthrow

عالج الأخطاء باستخدام الاستثناءات

try وcatch وthrow درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

الإبلاغ عن الأخطاء باستخدام throw

ترفع تعليمة throw استثناءً، فتتخلى عن المسار الحالي وتبحث عن معالج أعلى مكدس الاستدعاءات.

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("boom");
    } catch (const std::exception& e) {
        std::cout << e.what() << "\n";
    }
}

try وcatch

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

#include <iostream>
#include <stdexcept>

int divide(int a, int b) {
    if (b == 0) throw std::invalid_argument("divide by zero");
    return a / b;
}

int main() {
    try {
        std::cout << divide(10, 0) << "\n";
    } catch (const std::invalid_argument& e) {
        std::cout << "error: " << e.what() << "\n";
    }
}

التقاط الاستثناء بمرجع ثابت

التقط الاستثناءات دائمًا باستخدام const&. يؤدي الالتقاط بالقيمة إلى اقتطاع الاستثناءات المشتقة وإجراء نسخ غير ضروري.

كتل catch متعددة

أدرج المعالجات من الأكثر تخصيصًا إلى الأكثر عمومية. تُنفَّذ أول كتلة مطابقة.

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::out_of_range("bad index");
    } catch (const std::out_of_range& e) {
        std::cout << "range: " << e.what() << "\n";
    } catch (const std::exception& e) {
        std::cout << "other: " << e.what() << "\n";
    }
}

فك مكدس الاستدعاءات

عند رمي استثناء، يحدث فك لمكدس الاستدعاءات: يُتلف كل كائن محلي بين موضع الرمي والمعالج بترتيب عكسي.

#include <iostream>
#include <stdexcept>

struct Trace {
    ~Trace() { std::cout << "unwound\n"; }
};

void f() {
    Trace t;
    throw std::runtime_error("x");
}

int main() {
    try { f(); } catch (...) { std::cout << "caught\n"; }
}

معالج شامل

تلتقط كتلة catch (...) أي نوع من الاستثناءات. استخدمها باعتدال، وعادةً لتسجيل الاستثناء ثم إعادة رميه.

إعادة الرمي

داخل المعالج، تعيد throw; المجردة رمي الاستثناء الحالي مع الحفاظ على نوعه، حتى يتمكن معالج خارجي من التعامل معه.

#include <iostream>
#include <stdexcept>

void inner() { throw std::runtime_error("deep"); }

void middle() {
    try { inner(); }
    catch (...) { std::cout << "logged\n"; throw; }   // rethrow
}

int main() {
    try { middle(); } catch (const std::exception& e) { std::cout << e.what() << "\n"; }
}

هرمية الاستثناءات القياسية

ترث معظم الاستثناءات القياسية من std::exception، الذي يوفّر الدالة what(). ويؤدي التقاط std::exception إلى التعامل معها كلها.

ارمِ بالقيمة والتقط بالمرجع

ارمِ كائنات الاستثناء المؤقتة بالقيمة؛ إذ ينسخها وقت التشغيل إلى منطقة آمنة. والتقطها بالمرجع لتجنب الاقتطاع.

الاستثناءات مقابل رموز الخطأ

تفصل الاستثناءات مسار الخطأ عن المسار المعتاد، ولا يمكن تجاهلها بصمت — بخلاف رموز الإرجاع. خصّص استخدامها للحالات الاستثنائية فعلًا.

تؤدي الاستثناءات غير الملتقطة إلى إنهاء البرنامج

إذا لم يطابق أي معالج الاستثناء، فسيُستدعى std::terminate ويتوقف البرنامج. تعامل دائمًا مع الاستثناءات التي تتوقعها.

تحقق سريع

اختبر فهمك لمعالجة الاستثناءات.

مراجعة

تعلّمت رفع الأخطاء باستخدام throw، والتعامل معها باستخدام try/catch، وكيف يؤدي فك مكدس الاستدعاءات إلى إتلاف المتغيرات المحلية في الطريق. التقط باستخدام const&، ورتّب المعالجات من الأكثر تخصيصًا إلى الأكثر عمومية، وأعد الرمي باستخدام throw; المجردة.

الأسئلة الشائعة

هل درس «try وcatch وthrow» مجاني؟

نعم — نص درس «try وcatch وthrow» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «try وcatch وthrow»؟

عالج الأخطاء باستخدام الاستثناءات تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «try وcatch وthrow»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. try وcatch وthrow
  2. أمان الاستثناءات
  3. محدّد noexcept
  4. أنواع الاستثناءات المخصّصة
← العودة إلى C++ Academy