Özel Durumlar: Kendi İşlevlerinizden Özel Durum Atma
MFC özel durum işleme paradigması yalnızca MFC'deki veya diğer kitaplıklardaki işlevler tarafından oluşan özel durumları yakalamak için kullanılabilir. Kitaplık kodu tarafından oluşan özel durumları yakalamaya ek olarak, olağanüstü durumlarla karşılaşabilecek işlevler yazıyorsanız kendi kodunuzdan özel durumlar oluşturabilirsiniz.
Bir özel durum oluşturulduğunda, geçerli işlevin yürütülmesi durdurulur ve doğrudan en içteki özel durum çerçevesinin bloğuna catch
atlar. Özel durum mekanizması bir işlevden normal çıkış yolunu atlar. Bu nedenle, normal bir çıkışta silinecek bellek bloklarını sildiğinizden emin olmanız gerekir.
Özel durum oluşturma
gibi
AfxThrowMemoryException
MFC yardımcı işlevlerinden birini kullanın. Bu işlevler uygun türde önceden ayrılmış bir özel durum nesnesi oluşturur.Aşağıdaki örnekte, bir işlev iki bellek bloğu ayırmaya çalışır ve ayırma başarısız olursa bir özel durum oluşturur:
{ char* p1 = (char*)malloc(SIZE_FIRST); if (p1 == NULL) AfxThrowMemoryException(); char* p2 = (char*)malloc(SIZE_SECOND); if (p2 == NULL) { free(p1); AfxThrowMemoryException(); } // ... Do something with allocated blocks ... // In normal exit, both blocks are deleted. free(p1); free(p2); }
İlk ayırma başarısız olursa, yalnızca bellek özel durumunu oluşturabilirsiniz. İlk ayırma başarılı olursa, ancak ikincisi başarısız olursa, özel durum oluşturmadan önce ilk ayırma bloğunu boşaltmanız gerekir. Her iki ayırma da başarılı olursa, normal bir şekilde ilerleyebilir ve işlevden çıkarken blokları boşaltabilirsiniz.
- Veya-
Bir sorun koşulunu belirtmek için kullanıcı tanımlı özel durum kullanın. Özel durumunuz olarak sınıfın tamamı bile olmak üzere herhangi bir türde öğe oluşturabilirsiniz.
Aşağıdaki örnek, bir dalga cihazı üzerinden ses çalmayı dener ve bir hata varsa bir özel durum oluşturur.
#define WAVE_ERROR -5 { // This Win32 API returns 0 if the sound cannot be played. // Throw an integer constant if it fails. if (!PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC)) throw WAVE_ERROR; }
Dekont
MFC'nin özel durumları varsayılan olarak işlemesi yalnızca nesnelere (ve türetilmiş sınıfların CException
nesnelerineCException
) yönelik işaretçiler için geçerlidir. Yukarıdaki örnek MFC'nin özel durum mekanizmasını atlar.