Özel Durumlar: MFC Makroları ve C++ Özel Durumlarını Kullanma
Bu makalede hem MFC özel durum işleme makrolarını hem de C++ özel durum işleme anahtar sözcüklerini kullanan kod yazmayla ilgili önemli noktalar ele alınmaktadır.
Bu makalede aşağıdaki konular ele alınır:
Özel Durum Anahtar Sözcüklerini ve Makroları Karıştırma
MFC özel durum makrolarını ve C++ özel durum anahtar sözcüklerini aynı programda karıştırabilirsiniz. Ancak MFC makrolarını aynı bloktaki C++ özel durum anahtar sözcükleriyle karıştıramazsınız çünkü makrolar kapsam dışına çıktığında özel durum nesnelerini otomatik olarak silerken, özel durum işleme anahtar sözcüklerini kullanan kodlar bunu yapmaz. Daha fazla bilgi için Özel Durumlar: Özel Durumları Yakalama ve Silme makalesine bakın.
Makrolarla anahtar sözcükler arasındaki temel fark, özel durum kapsamın dışına çıktığında makroların yakalanan bir özel durumu "otomatik olarak" silmesidir. Anahtar sözcükleri kullanan kod; bir catch bloğunda yakalanan özel durumlar açıkça silinmelidir. Makroları ve C++ özel durum anahtar sözcüklerini karıştırmak, özel durum nesnesi silinmediğinde bellek sızıntılarına veya bir özel durum iki kez silindiğinde yığın bozulmasına neden olabilir.
Örneğin aşağıdaki kod, özel durum işaretçisini geçersiz kildi:
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, yürütme "iç" CATCH bloğundan çıktığında silindiği için e
oluşur. THROW deyimi yerine THROW_LAST makronun kullanılması "dış" CATCH bloğunun geçerli bir işaretçi almasına neden olur:
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
Catch Bloklarının İçindeki Blokları Deneyin
Geçerli özel durumu CATCH bloğunun içindeki bir try
bloğun içinden yeniden oluşturamazsınız. Aşağıdaki örnek geçersiz:
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 . Özel Durumlar: Özel Durum İçeriğini İnceleme.