Yönetilen Özel Durumları Kullanmaya İlişkin Temel Kavramlar

Bu konu başlığında yönetilen uygulamalarda özel durum işleme açıklanmaktadır. Diğer bir ifadeyle, /clr derleyici seçeneğiyle derlenmiş bir uygulamadır.

Bu konuda,

Açıklamalar

/clr seçeneğiyle derliyorsanız, CLR özel durumlarını işleyebilirsiniz ve standart Exception sınıf CLR özel durumlarını işlemek için birçok yararlı yöntem sağlar ve kullanıcı tanımlı özel durum sınıfları için temel sınıf olarak önerilir.

Bir arabirimden türetilen özel durum türlerinin yakalanması /clr altında desteklenmez. Ayrıca, ortak dil çalışma zamanı yığın taşması özel durumlarını yakalamanıza izin vermez; yığın taşması özel durumu işlemi sonlandıracaktır.

Yönetilen ve yönetilmeyen uygulamalarda özel durum işleme farklılıkları hakkında daha fazla bilgi için bkz. C++ için Yönetilen Uzantılar Altında Özel Durum İşleme Davranışındaki Farklılıklar.

/clr Altında Özel Durumlar Oluşturma

C++ throw ifadesi, CLR türüne tanıtıcı oluşturacak şekilde genişletilir. Aşağıdaki örnek özel bir özel durum türü oluşturur ve ardından bu türün bir örneğini oluşturur:

// clr_exception_handling.cpp
// compile with: /clr /c
ref struct MyStruct: public System::Exception {
public:
   int i;
};

void GlobalFunction() {
   MyStruct^ pMyStruct = gcnew MyStruct;
   throw pMyStruct;
}

Bir değer türü fırlatılmadan önce kutulanmalıdır.

// clr_exception_handling_2.cpp
// compile with: /clr /c
value struct MyValueStruct {
   int i;
};

void GlobalFunction() {
   MyValueStruct v = {11};
   throw (MyValueStruct ^)v;
}

CLR Uzantıları için Try/Catch Blokları

Aynı try/catch blok yapısı hem CLR hem de yerel özel durumları yakalamak için kullanılabilir:

// clr_exception_handling_3.cpp
// compile with: /clr
using namespace System;
ref struct MyStruct : public Exception {
public:
   int i;
};

struct CMyClass {
public:
   double d;
};

void GlobalFunction() {
   MyStruct^ pMyStruct = gcnew MyStruct;
   pMyStruct->i = 11;
   throw pMyStruct;
}

void GlobalFunction2() {
   CMyClass c = {2.0};
   throw c;
}

int main() {
   for ( int i = 1; i >= 0; --i ) {
      try {
         if ( i == 1 )
            GlobalFunction2();
         if ( i == 0 )
            GlobalFunction();
      }
      catch ( CMyClass& catchC ) {
         Console::WriteLine( "In 'catch(CMyClass& catchC)'" );
         Console::WriteLine( catchC.d );
      }
      catch ( MyStruct^ catchException ) {
         Console::WriteLine( "In 'catch(MyStruct^ catchException)'" );
         Console::WriteLine( catchException->i );
      }
   }
}

Çıktı

In 'catch(CMyClass& catchC)'
2
In 'catch(MyStruct^ catchException)'
11

C++ Nesneleri için Geri Sarmama Sırası

Çıkarma, fırlatma işlevi ile işleme işlevi arasında çalışma zamanı yığınında bulunan destrüktörlere sahip herhangi bir C++ nesnesi için gerçekleşir. CLR türleri yığında ayrıldığından, geri sarma bunlar için geçerli değildir.

Atılan istisna için olayların sırası aşağıdaki gibidir:

  1. Çalışma zamanı, özel durumu yakalamak için yığını tarayarak uygun catch yan tümcesini veya SEH için bir except filtresini arar. Catch yan tümceleri önce leksik sırada, ardından çağrı yığını boyunca dinamik olarak aşağı doğru aranır.

  2. Doğru işleyici bulunduktan sonra yığın bu noktaya kadar kaldırılır. Yığındaki her işlev çağrısı için yerel nesneler yok edilir ve __finally blokları, en içten dışa doğru yürütülür.

  3. Yığın çözüldükten sonra catch yan tümcesi yürütülür.

Yönetilmeyen Türleri Yakalama

Yönetilmeyen bir nesne türü fırlatıldığında, türü SEHException özel durumuyla sarmalanır. Uygun catch yan tümceyi ararken iki olasılık vardır.

  • Yerel bir C++ türüyle karşılaşıldığında, özel durum çözülür ve karşılaşılan türle karşılaştırılır. Bu karşılaştırma, yerel bir C++ türünün normal şekilde yakalanmasını sağlar.

  • Ancak, bir catch yan tümcesi SEHException veya temel sınıflarından herhangi biri önce incelenirse, yan tümce özel durumu engeller. Bu nedenle, yerel C++ türlerini yakalayan tüm catch bloklarını, CLR türlerinin catch bloklarından önce yerleştirmeniz gerekir.

Aşağıdakilere dikkat edin:

catch(Object^)

ve

catch(...)

Her iki yöntem de SEH hata durumları dahil olmak üzere herhangi bir türü yakalar.

Yönetilmeyen bir tür catch(Object^) tarafından yakalanırsa, atılan nesneyi yok etmeyecektir.

Yönetilmeyen özel durumlar oluştururken veya yakalarken, /EHsc derleyici seçeneğini /EHs veya /EHa yerine kullanmanızı öneririz.

Ayrıca bkz.

Özel Durum İşleme
safe_cast
Özel Durum İşleme