الاعتراضات EXCEPTEX MFC و Win32 بناء استثناءات

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية167802
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
الموجز
هو EXCEPTEX عينة يوضح على تعويض من كل من استثناءات الهيكلية Win32 و استثناءات C++ أساليب. لـ C++ استثناءات المساعد المتنوعة يتم توفير وظائف كيفية لاختراق فتح أكثر شائعة استخدام الفئات الاستثناء. استثناءات الهيكلية Win32 دالة مساعد بشرط التي تعرّف نوع طرح استثناء Win32.

الملفات التالية غير متوفرة للتنزيل من "مركز التنزيل لـ Microsoft":


Exceptex.exe

للحصول على معلومات إضافية حول كيفية تنزيل ملفات دعم Microsoft "، انقر فوق رقم المقالة التالي لعرضها في" قاعدة المعارف لـ Microsoft:
119591كيفية الحصول على ملفات دعم Microsoft من الخدمات عبر الإنترنت
قامت Microsoft بفحص هذا الملف بحثًا عن الفيروسات. استخدام Microsoft أحدث من برنامج كشف الفيروس المتوفر على التاريخ الذي تم نشر الملف. يتم تخزين الملف على ملقمات محسنة الأمان التي تساعد على منع إجراء أية تغييرات غير مصرح بها على الملف.

معلومات أخرى

دمج Win32 و معالجة استثناء C++

معالجة استثناء C++ معالجة استثناء الهيكلية لـ Win32 استخدم بناء الجملة مختلفة إلى اعتراض الاستثناءات.
    // C++ Exception Handler    try    {        // Do something that may raise an exception    }    catch( <class name> <instance of class> )    {        // handle exception    }    // Win32 Structured Exception Handler    __try    {        // Do something that may raise an exception    }    __except( expression )    {        // handle exception    }				
الفرق fundamental API أن يتوقع معالجة الاستثناء C++ لجذب مثيل من نوع ، بينما معالجة استثناء الهيكلية لـ Win32 catches فقط ثلاثة غير موقّع رجات.

يمكنك, على الرغم من ذلك، دمج كل من "C++" و "معالجة بواسطة الدالة _set_se_translator() استثناء Win32. يؤدي هذا استثناء Win32 إلى دالة معالج من اختيارك والتي يمكن التفاف معلومات استثناء Win32 في فئة "طرح" عليه كما C++ الاستثناء. ويحدث هذا تلقائياً عند استثناء Win32 ويظهر بشكل متميز إلى البرنامج كـ استثناء C++ (راجع "اختلافات معالجة استثناء" في infoviewer 5.0 VC). هذا هو تنفيذ تلقائياً إذا كنت تستخدم وحدات الماكرو سجل والملفات ذات الصلة تعتمد وظائف Log().
    // Class for containing information on a Win32 Structured Exception    class SEH_Exception {    private:        SEH_Exception() {}        unsigned int m_uSECode;    public:        SEH_Exception(unsigned int uSECode) : m_uSECode(uSECode) {}        ~SEH_Exception() {}        unsigned int getSeHNumber() { return m_uSECode; }    };    // Handler function that passes on Win32 Exception information in the    // C++ class SEH_Exception    void MappingSEHtoCPPExceptions( unsigned int uExceptionCode,                                                  _EXCEPTION_POINTERS* )    {        throw SEH_Exception( uExceptionCode );    }    // Initialize Exception Handling    void LogEnable( ... )    {        // Set Win32 Exceptions to be handled as C++ typed exceptions        _set_se_translator(MappingSEHtoCPPExceptions);        ...    }				
في هذه الحالة، LogEnable هل يمكن استدعاء مرة واحدة ، مبكراً في تنفيذ البرنامج و أية استثناءات Win32 مرفوع قد أن يدخل في ذلك باستخدام بناء الجملة C++. EXCEPTEX يوضح النموذج هذا باستخدام تعليمات برمجية إعطاء أعلاه.

أنواع استثناءات C++

توجد عدة فئات من استثناءات C++ يمكن أن يدخل في ذلك بواسطة برنامج مستند إلى MFC:

  • مثيلات الفئات المشتقة من الخاص بـ MFC CException
  • مثيلات الفئة تغليف Win32 استثناء
  • مثيلات من _com_error فئة الذي يتم رفع بواسطة 5.0 Visual C++ يدعم COM الأصلية متوفرة بواسطة توجيه #import.
لكل من هذه يقدم EXCEPTEX استدعاء LogException محمّلة فوق طاقتها من نوع محدد تم مصادفة استثناء دالة. في كل حالة رفع استثناء مثيل أو مؤشر من نوع محدد فئة C++ عادةً. توجد إصدارات LogException over-loaded لكل من أنواع استثناء C++ المذكورة أعلاه.

أسفل هي مثال تعريف الدالة LogException overloaded catches مؤشر إلى فئة CException MFC.
    // Crack open and log details of different types of exceptions    extern void LogException( CException    *e,                              LPCSTR        lpszTimeStamp,                              LPCSTR        lpszFile,                              int           nLine        );				
LogException أيضاً بتعقب رقم سطر واسم الملف حيث تم استخدام ماكرو الاستثناء الأخير في مكدس الاستدعاءات (إذا كانت مستخدمة مساعد سجل الماكرو).

كل من المساعد هذه الدالات فتح شقوق الاستثناء ويخزن النتائج في صفيف سلسلة يمكن معالجة الضرورة. هي دالة تفريغ محتويات هذا صفيف السلسلة إلى الماكرو TRACE() LogDisplay().

تبسيط حاول/catch بحظر يحتوي على "وحدات ماكرو مساعد"

littering كتل حاول/catch في التعليمات البرمجية يمكن الحصول على messy بعد الوقت. ومع ذلك، من الممكن تبسيط الاستثناء كتل خلال استخدام وحدات الماكرو. يوفر EXCEPTEX ثلاث وحدات الماكرو لتبسيط هذه العملية كما كل توفر وظائف مختلفة تسجيل/معالجة الاستثناءات. يتم كتابة كل من وحدات الماكرو أيضاً للعمل لكل 4.X Visual C++ و 5.0 Visual C++ ، لذا فإنها يجب التحقق من إصدار برنامج التحويل البرمجي الذي تستخدمه.

يوجد أدناه أبسط وحدات الماكرو LOGQ (الهادئ "استثناء المعالجة" مع لم تسجيل). يتوقع أن يتوفر متغير منطقية باسم bRetVal في التعليمات البرمجية. يجب أن يكون صحيحاً بحيث يسمح الماكرو تنفيذ التعليمات البرمجية التي قد تقوم بإصدار استثناء ثم يقوم بتعيين إلى FALSE في حدوث استثناء.
    #if _MSC_VER < 1100    // For version VC++ 4.2 or earlier        #define LOGQ( f ) if( bRetVal == TRUE )                \                           {                                    \                              try                               \                              {                                 \                                  f;                            \                              }                                 \                              catch( CException *e )            \                              {                                 \                                 bRetVal = FALSE;               \                                  e->Delete();                  \                              }                                 \                              catch( SEH_Exception )            \                              {                                 \                                 bRetVal = FALSE;               \                              }                                 \                              catch(...)                        \                              {                                 \                                 bRetVal = FALSE;               \                              }                                 \                           }    #else        #define LOGQ( f ) if( bRetVal == TRUE )                \                           {                                    \                              try                               \                              {                                 \                                 f;                             \                              }                                 \                              catch( CException *e )            \                              {                                 \                                 bRetVal = FALSE;               \                                 e->Delete();                   \                              }                                 \                              catch( _com_error )               \                              {                                 \                                 bRetVal = FALSE;               \                               }                                \                              catch( SEH_Exception )            \                              {                                 \                                 bRetVal = FALSE;               \                              }                                 \                              catch(...)                        \                              {                                 \                                 bRetVal = FALSE;               \                              }                                 \                           }    #endif				
_MSC_VER #ifdef بتقييد تعريف ماكرو محددة 4.X Visual C++ أو 5.0. يتضمن الإصدار 5.0 catch استثناء _com_error الموفرة حديثاً (تم إنشاؤه بواسطة التعليمات البرمجية التي تم إنشاؤها من #import).

استخدام LOGQ كما هو موضح أدناه:
    int     i = 0;    int     j;    BOOL    bRetVal = TRUE;    // This code is not safe    j = 1 / i;        // Raises Win32 Divide By Zero exception    // This code is safe    LOGQ( j = 1 / i; )				
يوجد جهازي إصدارات أخرى من وحدات الماكرو سجل يوفرها EXCEPTEX. يستخدم الماكرو سجل الثاني المساعدين LogException() overloaded الموضحة أعلاه.
    #define LOGE( f ) try                               \                       {                                 \                           f;                            \                       }                                 \                       catch( CException *e )            \                       {                                 \                           LogException( e,              \                                         __TIMESTAMP__,  \                                         __FILE__,       \                                         __LINE__      );\                       }                                 \                       ...				
هذا الماكرو لا يجعل استخدام من bRetVal العلامة. فإنه سيتم دوماً تنفيذ التعليمات البرمجية تغليف بواسطة الماكرو ، التقاط أي استثناءات مرفوع وتسجيل محتوياتها.

يدمج الماكرو سجل النهائية المتوفرة من قبل EXCEPTEX LOGR ، كل LOGQ و LOGE. التحقق لمعرفة ما إذا كان يجب تنفيذ التعليمات البرمجية وتسجيل أي استثناء يظهر.
    #define LOGR( f ) if( bRetVal == TRUE )                 \                       {                                     \                           try                               \                           {                                 \                               f;                            \                           }                                 \                           catch( CException *e )            \                           {                                 \                               LogException( e,              \                                             __TIMESTAMP__,  \                                             __FILE__,       \                                             __LINE__      );\                               bRetVal = FALSE;              \                           }                                 \                           ...                        }				

الدالات الأخرى المفيدة

توفر عينة EXCEPTEX ثلاثة المزيد من الدالات لمساعدة معالجة الاستثناء:
LogDisplay() تفريغ محتويات كافة الاستثناءات تسجيل الخروج خلال TRACE وحدات الماكرو.

LogDisplay (...) تفريغ محتويات كافة الاستثناءات تسجيل الخروج إلى مثيل CListBox.

LogSaveToFile (...) تفريغ محتويات كافة الاستثناءات تسجيل الخروج إلى ملف.

LOG.H و LOG.CPP

LOG.H و LOG.CPP تحتوي على كافة التعليمات البرمجية في EXCEPTEX لمعالجة الاستثناءات. الجزء المتبقي النموذج إلى عرض وحدات ماكرو/الدالات في LOG.H و LOG.CPP. هذه الملفين يمكن إضافة بسهولة إلى مشروع موجود تمت كتابة التحويل البرمجي في إما 4.X Visual C++ أو بناء 5.0 تحت كل من ANSI و UNICODE. لاستخدام هذه إضافة # تتضمن "log.h" على الملفات التي ستستخدم الماكرو LOGE أو LOGR. إذا كنت تريد لاختراق استثناءات الهيكلية Win32 أيضاً يجب استدعاء LogEnable مرة واحدة بالقرب من بداية البرنامج الخاص بك.
   // One time initialization of data    LogEnable(false);     // false to verbose mode				
إضافة الماكرو سجل في التعليمات البرمجية التي تريد استثناء من الحصول على البيانات.
   ...   LOGE(myFunction())   ...				
ملاحظة بالإبلاغ عن الملف ورقم سطر سيتم الماكرو سجل آخر في بنية تخزين العناصر. إذا استدعت myFunction() myFun1() و myFun2() ، يجب التفاف كل استدعاء الدالة مع ماكرو سجل للإخراج لعرض استدعاء أي حدث الاستثناء في.

قد لا تريد دوماً استخدام سجل في وحدات ماكرو أو حتى LogException() المساعدين كما تم توفيره. يتم عرض كليهما كـ الملاءمة ثم كما يحذف إلى شرح معالجة الاستثناء شاملة و لتسجيل نتائج أي استثناء مصادفة. لم يتم توفير هذه كـ end-all كافة يمكن استثناء معالجة في كل بيئة إنتاج.

استكشاف الأخطاء وإصلاحها

يوضح التعليمة البرمجية التالية كيف إلى استخدام وحدات الماكرو المساعد
    LOGQ( int i = 0; )    LOGQ( int j = 1 / i; )    // Will this raise a divide by zero?				
بإنشاء هذا الرمز خطأ برنامج التحويل برمجي كما يتم تعريفه i فقط في نطاق الماكرو LOGQ الأول. تذكر يوسّع LOGQ إلى:
>    ...    try    {        int i = 0;    }    ...    ...    try    {        int j = 1 / i;  // error C2065: 'i' : undeclared    }    ...				

/ W4 و #import

في حالة استخدام علامة /W4 في Visual C++ و #import ستشاهد 8 التحذيرات التي تم إنشاؤها إيقاف ملفات التضمين التي تستخدم #import.
comutil.h(905): تحذير C4310: تحويل اقتطاع قيمة ثابتة
comutil.h(928): تحذير C4310: تحويل اقتطاع قيمة ثابتة
comutil.h(1030): تحذير C4310: تحويل اقتطاع قيمة ثابتة
comutil.h(1281): تحذير C4310: تحويل اقتطاع قيمة ثابتة
comutil.h(1307): تحذير C4310: تحويل اقتطاع قيمة ثابتة
comutil.h(1476): تحذير C4310: تحويل اقتطاع قيمة ثابتة
comdef.h(242): تحذير C4244: 'إرجاع': التحويل من 'Int' إلى ' قصير' ، الممكن فقدان البيانات
يمكن تجاهل رسائل الخطأ هذه و يجب أن لا يؤثر على التعليمات البرمجية الخاصة بك.

للحصول على مزيد من المعلومات

تقديم الموضوع infoviewer VC ++ 5.0 التالي مقدمة جيدة إلى تقنيات معالجة الاستثناء:
معالجة الاستثناء: الأسئلة المتداولة
mk:@ivt:vccore/F26/D2A/S31BE4.HTM

اختلافات معالجة الاستثناء
mk:@ivt:vccore/F26/D2B/S4CC99.HTM
توضح المقالة التالية التقنيات التي يمكن استخدامها لتوسيع عينات EXCEPTEX لمعالجة الاستثناءات SDK DAO.
152695كيفية التقاط فك DAO المستندة إلى SDK استثناءات
يمكن العثور على مصدر definitive على معالجة استثناء Win32 في:

"Windows المتقدمة" بواسطة Richter فريدة ISBN 1-57231-548-2

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 167802 - آخر مراجعة: 02/14/2014 01:57:02 - المراجعة: 3.2

Microsoft Visual C++ 4.2 Enterprise Edition, Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 4.0 Standard Edition, Microsoft Visual C++ 4.1 Subscription, Microsoft Visual C++ 4.2 Professional Edition, Microsoft Visual C++ 5.0 Professional Edition

  • kbnosurvey kbarchive kbmt kbdownload kbdatabase kbfile kbsample KB167802 KbMtar
تعليقات