سؤال

كنت أحاول هذه القطعة من الكود للتحقق مما إذا كان يتم القبض على الفجوة على استثناء صفر:

int main(int argc, char* argv[])
{
    try
    {
      //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    catch (...)
    {
        std::cout<<"Caught exception\n";
    }
    return 0;
}

عندما امتثلت هذا باستخدام VC6 ، تم تنفيذ معالج الصيد وتم "استثناء الاستثناء". ومع ذلك ، عندما قمت بتجميع هذا باستخدام VS2008 ، تحطمت البرنامج دون تنفيذ كتلة الصيد. ماذا يمكن أن يكون سبب الفرق؟

هل كانت مفيدة؟

المحلول

تمكين معالجة الاستثناء المنظمة ضمن المشروع -> خصائص -> خصائص التكوين -> C/C ++ -> توليد الكود -> تمكين استثناءات C ++.

استخدم تجربة ما عدا. من الناحية المثالية مع مرشح يتحقق من رمز الاستثناء ، يقوم بإرجاع الإشارة المستمرة إذا كان يرغب في التقاطه. لقد تخطيت ذلك هنا ولكني أوصيك برؤيتك هنا لأمثلة من المرشح.

#include <iostream>
#include <windows.h>

int main(int argc, char* argv[])
{
    __try
    {
        //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        if(GetExceptionCode()==EXCEPTION_INT_DIVIDE_BY_ZERO)
            std::cout << "Caught int divison exception\n";
        else
            std::cout << "Caught exception\n";

        system("pause");
    }
    return 0;
}

نصائح أخرى

أنت تقوم بالقبض على استثناءات تم إنشاؤها بواسطة طبقة معالجة Microsoft المنظمة (SEH) ، وهي نظام تشغيل خاص بـ Microsoft. كما اقترح Mykola ، قد تحتاج إلى تعويذة مع خيارات المترجم الخاصة بك ، ولكن كن على دراية بأن هذا الرمز لن يكون محمولًا لأنظمة التشغيل الأخرى أو حتى المترجمين الآخرين الذين يعملون على Windows.

انتقل إلى خصائص مشروعك ، ضمن C/C ++ ، توليد الكود ، ستجد "تمكين استثناءات C ++". تغيير هذا الخيار إلى "نعم ، مع استثناءات SEH"

ضع في اعتبارك أنك ستتمكن فقط من التقاط هذا النوع من الاستثناءات باستخدام أيضًا:

  • try {} catch(...) {} (مع القطع الناقص)
  • __try {} __except() {} (مع مرشح مناسب في __except)
  • باستخدام SetUnhandledExceptionFilter()

للحصول على قيم صالحة في __except انظر هنا

في حالة Visual Studio ، يمكن أن يكون خيارات البرمجة المترجم. ولكن حسب القياسي ، لن يتم طرح الاستثناء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top