استثناء في الكود
-
05-07-2019 - |
سؤال
كنت أحاول هذه القطعة من الكود للتحقق مما إذا كان يتم القبض على الفجوة على استثناء صفر:
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 ، يمكن أن يكون خيارات البرمجة المترجم. ولكن حسب القياسي ، لن يتم طرح الاستثناء.