كيف قبض على مستوى النظام الاستثناءات في لينكس C++?

StackOverflow https://stackoverflow.com/questions/618215

سؤال

التالية الصيد() لا يسمى:

void test(void)
{
    int i=1,j=0,k;
    try
    {
        k = i/j;
    }
    catch(...)
    {
        ...handle it...
    }
}

هل هناك طريقة للقبض على هذا النوع من استثناء ؟

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

المحلول

يرجى التحقق http://linux.die.net/man/1/gcc هناك خيار مترجم -mcheck-صفر في دوري الدرجة للتعامل مع هذا.

وبدلا من ذلك، وتركيب معالج SIGFPE قد يكون خيارا،  ومن شأن شعبة تطفو من قبل 0 ثم تولد "FPE_ZERODIVIDE '

         signal(SIGFPE, (fptr) FPE_ExceptionHandler);

         void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/)
          {
                switch(nErrType)
                  {
                    case FPE_ZERODIVIDE:  /* ??? */ break;
                }

            }

ومنذ

وتستند معظم أنظمة النقطة العائمة على مستوى IEEE، الذي يسمح القسمة على 0. هذا يعود إما لا نهاية إيجابية أو اللانهاية السالبة حسب الاقتضاء بناء على علامات الأرقام. (باستثناء 0/0 إرجاع غير محدد NAN - مرة أخرى يست حالة استثنائية) هذا يميل إلى أن يكون مفيدا للتطبيقات العلمية والرياضية. ونا إشارة فعال حالة حيث كانت الحسابات لا pssible لكن تسمح حسابات للمتابعة. فإن حسابات واصل لا تسفر عن نتائج جديدة ولكن سوف تستمر في العودة نا. وهذا يسمح سلاسل طويلة طويلة من العمليات الحسابية التي يتعين القيام بها بدون صورة شخصية التحقق خطأ داخل calculatiosn. تحتاج الشيكات الخطأ فقط التي يتعين القيام بها في النهاية من العمل. وهذا يجعل رمز أبسط من ذلك بكثير بكثير وأيضا أسرع. كما يمكن أن يكون أكثر فائدة في بعض الأحيان بالنسبة لبعض التطبيقات، infintity هو "مفيدة" نتيجة، وليس حقا علامة على مشاكل.

نصائح أخرى

ولا - ليس هناك استثناء القيت (تحصل على إشارة - ربما SIGFPE). تحتاج إلى التحقق لاحتمال القسمة على صفر في التعليمات البرمجية، ومن ثم رمي استثناء نفسك،

إذا كان هذا يسبب خطأ وقت التشغيل على الإطلاق (انظر lakshmanaraj الجميل مناقشة IEEE الرياضيات, ، على الرغم من بعض مترجم تمكنك من قوة الأخطاء بدلا من NaNs) ، فإنه يلقي النقطة العائمة استثناء إشارة.

إشارات آلية مختلفة من استثناءات c++, و يتم التعامل معها على مستوى نظام التشغيل.هناك بالفعل عدد من الأسئلة المتعلقة *nix إشارة آلية ، بما في ذلك:

ويندوز, يجب عليك أن تطلب من شخص آخر.نظام التشغيل Mac OS X هو-بالطبع-unix المستمدة من النظام.

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