Aracılığıyla paylaş


Özel durumlar: mfc makroları kullanma ve C++ özel durumlar

Bu makalede, mfc özel durum işleme makrolar hem C++ özel durum işleme anahtar sözcükleri kullanan kod yazma hakkında önemli noktalar açıklanır.

Bu makale aşağıdaki konuları kapsar:

  • Özel anahtar sözcükler ve makrolar

  • Try bloğu içine catch bloklarını kullanın

Özel anahtar sözcükler ve makrolar

mfc özel makrolar ve C++ özel anahtar sözcükler aynı programdaki karıştırabilirsiniz.Ancak kapsam dışına gittiğinizde kodu özel durum işleme sözcükleriyle'nin almadığı makroları exception nesneleri otomatik olarak silmek için aynı blok özel anahtar sözcükler C++ mfc makroları karıştırılamaz.Bu makalede daha fazla bilgi için bkz: özel durumlar: çalýþýrçalýþma ve silme özel durumlar.

Makrolar ve anahtar sözcükler arasındaki ana fark istisna kapsamı dışına çıktığında makroları "otomatik olarak" özel durum yakaladı Sil ' dir.Anahtar sözcükler kullanarak kod içermez; istisnalar bir catch bloğu içinde yakalandı açıkça silinmelidir.Makrolar ve C++ özel anahtar sözcükler bellek sızıntıları neden bir özel durum nesnesi silinmez veya istisna iki kez silindiğinde Bozulması yığın.

Örneğin, aşağıdaki kod, istisna işaretçi geçersiz kılar:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      throw;  // Invalid attempt to throw exception
            // to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is invalid because
    // it was deleted in the inner catch block.
}
END_CATCH

Sorun e "İç" dışında yürütme geçerken silinmiş catch blok.Kullanarak THROW_LAST yerine makro throw deyimi neden olacak "dış" catch geçerli işaretçi almayı engelle:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      THROW_LAST(); // Throw exception to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is valid because
    // THROW_LAST() was used.
}
END_CATCH

Blok içinde Catch bloğu deneyin

Geçerli durum içinden re-throw edilemez bir deneyin içinde bloğu bir catch blok.Aşağıdaki örnek, geçerli değil:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   try
   {
      throw;  // Wrong.  Causes e (the exception 
            // being thrown) to be deleted.
   }
   catch(CException* exception)
   {
      exception->ReportError();
   }
}
END_CATCH

Daha fazla bilgi için bkz: durumlar: özel içeriği inceleyerek.

Ayrıca bkz.

Kavramlar

Özel durum işleme mfc