Ö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.