/EH (طراز معالجة ‏‏ استثناء)

قم بتعيين طراز معالجة ‏‏ استثناء إلى ليتم استخدامها من قبل المحول البرمجي ويزيل الكائنات C + + سيتم انتقال خارج نطاق نتيجة للاستثناء. إذا /EHهو ليس محدداً، المحول البرمجي جذب مصنفة واستثناءات C + +، ولكن لن إتلاف الكائنات C + + سيتم انتقال خارج نطاق نتيجة للاستثناء.

/EH{s|a}[c][-]

الوسيطات

  • a
    طراز معالجة الاستثناءات التي catches غير متزامن (بناء) والاستثناءات متزامن (C + +).

  • s
    طراز معالجة ‏‏ استثناءات التي catches استثناء C + + فقط ويعلم المحول البرمجي إلى تفترض أن externرمى دالات C على ‏‏ استثناء.

  • c
    إذا كانت مستخدمة s(/EHsc) ، catches استثناء C + + فقط وقم بإعلام المحول البرمجي إلى تفترض التي externدالات C عدم طرح ‏‏ استثناء C + +. /EHcaهو المكافئ إلى**/EHa**.

ملاحظات

استخدام /EHsإلى تعيين ‏‏ استثناء متزامن معالجة الطراز (معالجة دون استثناء مصنفة معالجة ‏‏ استثناءات ‏‏ استثناء C + +). إذا كنت تستخدم /EHs، ثم الخاص بك catchلا يتم التقاط جملة غير متزامن الاستثناءات. وكذلك الجميع الكائنات الموجودة في نطاق عند غير متزامن يتم إنشاء استثناء سوف لا يتم إتلاف حتى لو غير متزامن معالجة ‏‏ استثناء. تحت /EHs، catch(...)يقوم فقط بالتقاط C + + استثناءات. الوصول إلى انتهاكات و System.Exceptionاستثناءات سوف لا يتم حظر.

استخدام /EHaإلى تعيين ‏‏ استثناء غير المتزامنة معالجة الطراز (معالجة استثناء مصنفة معالجة ‏‏ استثناءات ‏‏ استثناء C + +). /EHaقد يتسبب في نسخة performant أقل لأنه لم يتم أمثلية المحول البرمجيtryحظر كما aggressively، حتى في حالة المحول البرمجي لا يرى يرمي.

استخدام /EHaإذا كنت تريد التقاط إستثناء مرفوع بشيء آخر بخلاف throw. يقوم نموذج التالي بإنشاء استثناء:

// compiler_options_EHA.cpp
// compile with: /EHa
#include <iostream>
#include <excpt.h>
using namespace std;

void fail() {   // generates SE and attempts to catch it using catch(...)
   try {
      int i = 0, j = 1;
      j /= i;   // This will throw a SE (divide by zero).
      printf("%d", j); 
   }
   catch(...) {   // catch block will only be executed under /EHa
      cout<<"Caught an exception in catch(...)."<<endl;
   }
}

int main() {
   __try {
      fail(); 
   }

   // __except will only catch an exception here
   __except(EXCEPTION_EXECUTE_HANDLER) {   
   // if the exception was not caught by the catch(...) inside fail()
      cout << "An exception was caught in __except." << endl;
   }
}

/EHcخيار يتطلب أن /EHsأو /EHaالمحدد. استخدام /clr (التحويل البرمجي وقت تشغيل اللغة العامة)يعني /EHa(/clr /EHaهو redundant). المترجم سيقوم بإنشاء خطأ إذا **/EHs[c]**هو استخدامه بعد /clr. أمثلية الأداء لن يؤثر هذا سلوك. عند استثناء هو تم مصادفة، المحول البرمجي باستدعاء destructor فئة أو destructors للكائن أو الكائنات الموجودة في نفس المجال كالاستثناء. عند استثناء هو لا بحظر هذه destructors لا تعمل.

_set_se_translatorلمعالجة ‏‏ استثناء قيود تحت راجع /clr.

إلغاء تحديد خيار بواسطة الرمز -. على سبيل المثال، /EHsc-هو ترجمة ك /EHs /EHc-و هو يساوي /EHs.

لمزيد من المعلومات، راجع Exception Handling: Default Synchronous Exception Model.

لتعيين خيار المحول البرمجي هذا في بيئة تطوير Visual Studio

  1. افتح مربع الحوار صفحات الخصائص للمشروع. للمزيد من التفاصيل ، راجع كيفية: صفحات الخصائص المشاريع المفتوحة.

  2. انقر فوق المجلد /C + + C.

  3. انقر فوق صفحة الخصائص إنشاء تعليمات برمجية.

  4. تعديل تمكين استثناءات C + + خاصية.

بدلاً من ذلك، يمكنك استخدم إجراء التالي:

لتعيين خيار المحول البرمجي هذا في بيئة تطوير Visual Studio

  1. انقر فوق المجلد /C + + C.

  2. انقر فوق صفحة الخصائص إنشاء تعليمات برمجية.

  3. قم بتعيين تمكين استثناءات C + + إلى لا .

  4. انقر فوق صفحة الخصائص سطر الأوامر.

  5. اكتب خيار المترجم في المربع خيارات إضافى.

إلى قم بتعيين هذا خيار المترجم برمجياً

راجع أيضًا:

المرجع

خيار المحول البرمجي

خيارات إعداد المترجم

Exception Specifications