Özel Durumlar: MFC Özel Durum Makrolarından Dönüştürme
Bu gelişmiş bir konudur.
Bu makalede, C++ özel durum işleme anahtar sözcüklerini try
catch
throw
kullanmak için Microsoft Foundation Sınıfı makrolarıyla yazılmış mevcut kodun (TRY, CATCH, THROW vb.) nasıl dönüştürüldüğü açıklanmaktadır. Konu başlıkları şunlardır:
Dönüştürmenin Avantajları
MFC sürüm 3.0'daki makro uygulamalarıyla önceki sürümlerdeki uygulamalar arasındaki farkların farkında olmanız gerekir, ancak var olan kodu dönüştürmeniz gerekmez. Bu farklar ve kod davranışındaki sonraki değişiklikler, Özel Durumlar: Sürüm 3.0'daki Özel Durum Makrolarındaki Değişiklikler bölümünde ele alınıyor.
Dönüştürmenin başlıca avantajları şunlardır:
C++ özel durum işleme anahtar sözcüklerini kullanan kod biraz daha küçük bir .EXE veya .DLL'ye derler.
C++ özel durum işleme anahtar sözcükleri daha çok yönlü: Kopyalanabilir herhangi bir veri türünün (
int
,float
,char
vb.) özel durumlarını işleyebilirken, makrolar yalnızca sınıfCException
ve sınıflardan türetilen özel durumları işler.
Makrolar ve anahtar sözcükler arasındaki en önemli fark, makroları kullanan kodun özel durum kapsam dışına çıktığında yakalanan bir özel durumu "otomatik olarak" silmesidir. Anahtar sözcükleri kullanan kod bunu yapmaz, bu nedenle yakalanan özel durumu açıkça silmeniz gerekir. Daha fazla bilgi için Özel Durumlar: Özel Durumları Yakalama ve Silme makalesine bakın.
Diğer bir fark söz dizimidir. Makroların ve anahtar sözcüklerin söz dizimi üç açıdan farklılık gösterir:
Makro bağımsız değişkenleri ve özel durum bildirimleri:
CATCH makro çağrısı aşağıdaki söz dizimine sahiptir:
CATCH(exception_class, exception_object_pointer_name)
Sınıf adı ile nesne işaretçisi adı arasındaki virgüle dikkat edin.
anahtar sözcüğü için
catch
özel durum bildirimi şu söz dizimini kullanır:catch(exception_typeexception_name)
Bu özel durum bildirimi deyimi, catch bloğunun işlediği özel durum türünü gösterir.
Catch bloklarının sınırlandırması:
Makrolarla birlikte, CATCH makro (bağımsız değişkenleriyle) ilk yakalama bloğunu başlatır; AND_CATCH makro sonraki yakalama bloklarını başlatır ve END_CATCH makro, yakalama bloklarının sırasını sonlandırır.
Anahtar sözcüklerle,
catch
anahtar sözcüğü (özel durum bildirimiyle) her catch bloğunu başlatır. END_CATCH makrosunun bir karşılığı yoktur; yakalama bloğu kapanış küme ayracı ile sona erer.Throw ifadesi:
Makrolar geçerli özel durumu yeniden atmak için THROW_LAST kullanır.
throw
Bağımsız değişken içermeyen anahtar sözcüğü aynı etkiye sahiptir.
Dönüştürmeyi Yapma
C++ özel durum işleme anahtar sözcüklerini kullanmak üzere makro kullanarak kodu dönüştürmek için
TRY, CATCH, AND_CATCH, END_CATCH, THROW ve THROW_LAST MFC makrolarının tüm oluşumlarını bulun.
Aşağıdaki makroların tüm oluşumlarını değiştirin veya silin:
TRY (ile
try
değiştirin)CATCH (bunu ile
catch
değiştirin)AND_CATCH (ile
catch
değiştirin)END_CATCH (Silin)
THROW (şununla
throw
değiştirin)THROW_LAST (ile
throw
değiştirin)Makro bağımsız değişkenlerini geçerli özel durum bildirimleri oluşturacak şekilde değiştirin.
Örneğin,
CATCH(CException, e)
kullanıcısı
catch (CException* e)
Catch bloklarındaki kodu, özel durum nesnelerini gerektiği gibi silecek şekilde değiştirin. Daha fazla bilgi için Özel Durumlar: Özel Durumları Yakalama ve Silme makalesine bakın.
Aşağıda, MFC özel durum makrolarını kullanan özel durum işleme kodu örneği verilmiştir. Aşağıdaki örnekteki kod makroları kullandığından özel durumun e
otomatik olarak silindiğini unutmayın:
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
if (m_bPassExceptionsUp)
THROW_LAST();
if (m_bReturnFromThisFunction)
return;
// Not necessary to delete the exception e.
}
END_CATCH
Sonraki örnekteki kod C++ özel durum anahtar sözcüklerini kullandığından özel durumun açıkça silinmesi gerekir:
try
{
// Do something to throw an exception.
AfxThrowUserException();
}
catch (CException* e)
{
if (m_bPassExceptionsUp)
throw;
if (m_bThrowDifferentException)
{
e->Delete();
throw new CMyOtherException;
}
if (m_bReturnFromThisFunction)
{
e->Delete();
return;
}
e->Delete();
}
Daha fazla bilgi için bkz . Özel Durumlar: MFC Makrolarını Kullanma ve C++ Özel Durumları.