Özel Durum İşleme
Bir program yürütürken, "özel durumlar" olarak adlandırılan bir dizi anormal koşul ve hata oluşabilir. Bunlar arasında bellek yetersizliği, kaynak ayırma hataları ve dosyaların bulunamaması sayılabilir.
Microsoft Foundation Sınıf Kitaplığı, C++ için ANSI standartları komitesi tarafından önerilenden sonra yakından modellenen bir özel durum işleme şeması kullanır. Anormal bir durumla karşılaşabilecek bir işlev çağrılmadan önce bir özel durum işleyicisi ayarlanmalıdır. İşlev anormal bir durumla karşılaşırsa, bir özel durum oluşturur ve denetim özel durum işleyicisine geçirilir.
Microsoft Foundation Sınıf Kitaplığı'na dahil edilen çeşitli makrolar özel durum işleyicileri ayarlar. Bir dizi diğer genel işlev, özel özel durumlar oluşturulmasına ve gerekirse programları sonlandırmaya yardımcı olur. Bu makrolar ve genel işlevler aşağıdaki kategorilere ayrılır:
Özel durum işleyicinizi yapılandıran özel durum makroları.
Özel durum oluşturan işlevler), belirli türlerin özel durumlarını oluşturur.
Program sonlandırmaya neden olan sonlandırma işlevleri.
Örnekler ve diğer ayrıntılar için Özel durumlar makalesine bakın.
Özel Durum Makroları
Veri Akışı Adı | Açıklama |
---|---|
DENEMEK | Özel durum işleme için bir kod bloğu tanımlar. |
TUTMAK | Yukarıdaki TRY bloğundan bir özel durum yakalamak için bir kod bloğu tanımlar. |
CATCH_ALL | Önceki TRY bloğundaki tüm özel durumları yakalamak için bir kod bloğu tanımlar. |
AND_CATCH | Yukarıdaki TRY bloğundan ek özel durum türlerini yakalamak için bir kod bloğu tanımlar. |
AND_CATCH_ALL | Yukarıdaki TRY bloğunda oluşan diğer tüm ek özel durum türlerini yakalamak için bir kod bloğu tanımlar. |
END_CATCH | Son CATCH veya AND_CATCH kod bloğunu sonlandırır. |
END_CATCH_ALL | Son CATCH_ALL kod bloğunu sonlandırır. |
ATMAK | Belirtilen bir özel durum oluşturur. |
THROW_LAST | Şu anda işlenen özel durumu bir sonraki dış işleyiciye atar. |
Özel Durum Oluşturan İşlevler
Veri Akışı Adı | Açıklama |
---|---|
AfxThrowArchiveException | Arşiv özel durumu oluşturur. |
AfxThrowFileException | Bir dosya özel durumu oluşturur. |
AfxThrowInvalidArgException | Geçersiz bir bağımsız değişken özel durumu oluşturur. |
AfxThrowMemoryException | Bir bellek özel durumu oluşturur. |
AfxThrowNotSupportedException | Desteklenmeyen bir özel durum oluşturur. |
AfxThrowResourceException | Windows kaynağı bulunamadı özel durumu oluşturur. |
AfxThrowUserException | Kullanıcı tarafından başlatılan bir program eyleminde özel durum oluşturur. |
MFC, ÖZELLIKLE OLE özel durumları için iki özel durum oluşturan işlev sağlar:
OLE Özel Durum İşlevleri
Veri Akışı Adı | Açıklama |
---|---|
AfxThrowOleDispatchException | OLE otomasyon işlevi içinde bir özel durum oluşturur. |
AfxThrowOleException | OLE özel durumu oluşturur. |
Veritabanı özel durumlarını desteklemek için, veritabanı sınıfları iki özel durum sınıfı CDBException
ve CDaoException
özel durum türlerini desteklemek için genel işlevler sağlar:
DAO Özel Durum İşlevleri
Veri Akışı Adı | Açıklama |
---|---|
AfxThrowDAOException | Kendi kodunuzdan bir CDaoException oluşturur. |
AfxThrowDBException | Kendi kodunuzdan bir CDBException oluşturur. |
MFC aşağıdaki sonlandırma işlevini sağlar:
Sonlandırma İşlevleri
Veri Akışı Adı | Açıklama |
---|---|
AfxAbort | Önemli bir hata oluştuğunda uygulamayı sonlandırmak için çağrılır. |
TRY
TRY bloğu ayarlar.
TRY
Açıklamalar
TRY bloğu, özel durumlar oluşturabilecek bir kod bloğunu tanımlar. Bu özel durumlar aşağıdaki CATCH ve AND_CATCH bloklarında işlenir. Özyineleme izin verilir: Dış TRY bloğuna özel durumlar geçirilebilir; bunlar yoksayılarak veya THROW_LAST makro kullanılarak. TRY bloğunu bir END_CATCH veya END_CATCH_ALL makroyla sonlandırın.
Daha fazla bilgi için Özel durumlar makalesine bakın.
Örnek
CATCH örneğine bakın.
Gereksinimler
Üst bilgi: afx.h
TUTMAK
Önceki TRY bloğunda oluşan ilk özel durum türünü yakalayan bir kod bloğu tanımlar.
CATCH(exception_class, exception_object_pointer_name)
Parametreler
exception_class
Test etmek için özel durum türünü belirtir. Standart özel durum sınıflarının listesi için bkz. CException sınıfı.
exception_object_pointer_name
Makro tarafından oluşturulacak bir özel durum-nesne işaretçisi için bir ad belirtir. CATCH bloğundaki özel durum nesnesine erişmek için işaretçi adını kullanabilirsiniz. Bu değişken sizin için bildirilir.
Açıklamalar
Özel durum işleme kodu, özel durumun belirli nedeni hakkında daha fazla bilgi almak için uygunsa özel durum nesnesini sorgulayabilir. İşlemeyi sonraki dış özel durum çerçevesine kaydırmak için THROW_LAST makroyu çağırın. TRY bloğunu bir END_CATCH makroyla sonlandırın.
exception_class sınıfı CException
ise, tüm özel durum türleri yakalanacaktır. Hangi özel durumun oluşturulduğuna karar vermek için CObject::IsKindOf üye işlevini kullanabilirsiniz. Çeşitli özel durum türlerini yakalamanın daha iyi bir yolu, her biri farklı bir özel durum türüne sahip sıralı AND_CATCH deyimleri kullanmaktır.
Özel durum nesnesi işaretçisi makro tarafından oluşturulur. Kendiniz bildirmeniz gerekmez.
Not
CATCH bloğu, küme ayraçlarıyla ayrılmış bir C++ kapsamı olarak tanımlanır. Bu kapsamdaki değişkenleri bildirirseniz, bunlara yalnızca bu kapsamda erişilebilir. Bu, exception_object_pointer_name için de geçerlidir.
Özel durumlar ve CATCH makro hakkında daha fazla bilgi için Özel durumlar makalesine bakın.
Örnek
CFile* pFile = NULL;
// Constructing a CFile object with this override may throw
// a CFile exception and won't throw any other exceptions.
// Calling CString::Format() may throw a CMemoryException,
// so we have a catch block for such exceptions, too. Any
// other exception types this function throws will be
// routed to the calling function.
TRY
{
pFile = new CFile(_T("C:\\WINDOWS\\SYSTEM.INI"),
CFile::modeRead | CFile::shareDenyNone);
ULONGLONG dwLength = pFile->GetLength();
CString str;
str.Format(_T("Your SYSTEM.INI file is %I64u bytes long.") , dwLength);
AfxMessageBox(str);
}
CATCH(CFileException, pEx)
{
// Simply show an error message to the user.
pEx->ReportError();
}
AND_CATCH(CMemoryException, pEx)
{
// We can't recover from this memory exception, so we'll
// just terminate the app without any cleanup. Normally,
// an application should do everything it possibly can to
// clean up properly and not call AfxAbort().
AfxAbort();
}
END_CATCH
// If an exception occurs in the CFile constructor,
// the language will free the memory allocated by new
// and will not complete the assignment to pFile.
// Thus, our cleanup code needs to test for NULL.
if (pFile != NULL)
{
pFile->Close();
delete pFile;
}
CATCH_ALL
Önceki TRY bloğunda oluşan tüm özel durum türlerini yakalayan bir kod bloğu tanımlar.
CATCH_ALL(exception_object_pointer_name)
Parametreler
exception_object_pointer_name
Makro tarafından oluşturulacak bir özel durum-nesne işaretçisi için bir ad belirtir. blok içindeki CATCH_ALL
özel durum nesnesine erişmek için işaretçi adını kullanabilirsiniz. Bu değişken sizin için bildirilir.
Açıklamalar
Özel durum işleme kodu, özel durumun belirli nedeni hakkında daha fazla bilgi almak için uygunsa özel durum nesnesini sorgulayabilir. İşlemeyi THROW_LAST
bir sonraki dış özel durum çerçevesine kaydırmak için makroyu çağırın. CATCH_ALL kullanıyorsanız, TRY bloğunu bir END_CATCH_ALL makroyla sonlandırın.
Not
CATCH_ALL bloğu, ayraçlar tarafından çizgili bir C++ kapsamı olarak tanımlanır. Bu kapsamdaki değişkenleri bildirirseniz, bunlara yalnızca bu kapsamda erişilebilir.
Özel durumlar hakkında daha fazla bilgi için Özel durumlar makalesine bakın.
Örnek
CFile::Abort örneğine bakın.
Gereksinimler
Üst bilgi afx.h
AND_CATCH
Yukarıdaki TRY bloğunda oluşan ek özel durum türlerini yakalamak için bir kod bloğu tanımlar.
AND_CATCH(exception_class, exception_object_pointer_name)
Parametreler
exception_class
Test etmek için özel durum türünü belirtir. Standart özel durum sınıflarının listesi için bkz. CException sınıfı.
exception_object_pointer_name
Makro tarafından oluşturulacak bir özel durum-nesne işaretçisinin adı. AND_CATCH bloğundaki özel durum nesnesine erişmek için işaretçi adını kullanabilirsiniz. Bu değişken sizin için bildirilir.
Açıklamalar
Bir özel durum türünü yakalamak için CATCH makrosunu kullanın, ardından sonraki her türü yakalamak için makroyu AND_CATCH. TRY bloğunu bir END_CATCH makroyla sonlandırın.
Özel durum işleme kodu, özel durumun belirli nedeni hakkında daha fazla bilgi almak için uygunsa özel durum nesnesini sorgulayabilir. İşlemeyi bir sonraki dış özel durum çerçevesine kaydırmak için AND_CATCH bloğundaki THROW_LAST makroyu çağırın. AND_CATCH, önceki CATCH veya AND_CATCH bloğunun sonunu işaretler.
Not
AND_CATCH bloğu bir C++ kapsamı olarak tanımlanır (küme ayraçlarıyla gösterilir). Bu kapsamda değişkenler bildirirseniz, bunların yalnızca bu kapsamda erişilebilir olduğunu unutmayın. Bu, exception_object_pointer_name değişkeni için de geçerlidir.
Örnek
CATCH örneğine bakın.
Gereksinimler
Üst bilgi afx.h
AND_CATCH_ALL
Yukarıdaki TRY bloğunda oluşan ek özel durum türlerini yakalamak için bir kod bloğu tanımlar.
AND_CATCH_ALL(exception_object_pointer_name)
Parametreler
exception_object_pointer_name
Makro tarafından oluşturulacak bir özel durum-nesne işaretçisinin adı. AND_CATCH_ALL bloğundaki özel durum nesnesine erişmek için işaretçi adını kullanabilirsiniz. Bu değişken sizin için bildirilir.
Açıklamalar
Bir özel durum türünü yakalamak için CATCH makrosunu, ardından sonraki tüm türleri yakalamak için makroyu AND_CATCH_ALL kullanın. AND_CATCH_ALL kullanıyorsanız, TRY bloğunu bir END_CATCH_ALL makroyla sonlandırın.
Özel durum işleme kodu, özel durumun belirli nedeni hakkında daha fazla bilgi almak için uygunsa özel durum nesnesini sorgulayabilir. İşlemeyi bir sonraki dış özel durum çerçevesine kaydırmak için AND_CATCH_ALL bloğundaki THROW_LAST makroyu çağırın. AND_CATCH_ALL, önceki CATCH veya AND_CATCH_ALL bloğunun sonunu işaretler.
Not
AND_CATCH_ALL bloğu C++ kapsamı olarak tanımlanır (ayraçlarla gösterilir). Bu kapsamda değişkenler bildirirseniz, bunların yalnızca bu kapsamda erişilebilir olduğunu unutmayın.
Gereksinimler
Üst bilgi afx.h
END_CATCH
Son CATCH veya AND_CATCH bloğunun sonunu işaretler.
END_CATCH
Açıklamalar
END_CATCH makro hakkında daha fazla bilgi için Özel durumlar makalesine bakın.
Gereksinimler
Üst bilgi afx.h
END_CATCH_ALL
Son CATCH_ALL88 veya AND_CATCH_ALL bloğunun sonunu işaretler.
END_CATCH_ALL
Gereksinimler
Üst bilgi afx.h
THROW (MFC)
Belirtilen özel durumu oluşturur.
THROW(exception_object_pointer)
Parametreler
exception_object_pointer
öğesinden türetilen bir özel durum nesnesine CException
işaret etti.
Açıklamalar
THROW , program yürütmeyi kesintiye uğratarak denetimi programınızdaki ilişkili CATCH bloğuna geçirir. CATCH bloğunu sağlamadıysanız, denetim bir hata iletisi yazdıran ve çıkan bir Microsoft Foundation Sınıf Kitaplığı modülüne geçirilir.
Daha fazla bilgi için Özel durumlar makalesine bakın.
Gereksinimler
Üst bilgi afx.h
THROW_LAST
Özel durumu bir sonraki dış CATCH bloğuna geri atar.
THROW_LAST()
Açıklamalar
Bu makro, yerel olarak oluşturulmuş bir özel durum oluşturmanıza olanak tanır. Yeni yakaladığınız bir özel durum oluşturmaya çalışırsanız, normalde kapsamın dışına çıkar ve silinir. THROW_LAST ile, özel durum bir sonraki CATCH işleyicisine doğru şekilde geçirilir.
Daha fazla bilgi için Özel durumlar makalesine bakın.
Örnek
CFile::Abort örneğine bakın.
Gereksinimler
Üst bilgi afx.h
AfxThrowArchiveException
Arşiv özel durumu oluşturur.
void AfxThrowArchiveException(int cause, LPCTSTR lpszArchiveName);
Parametreler
neden
Özel durumun nedenini gösteren bir tamsayı belirtir. Olası değerlerin listesi için bkz . CArchiveException::m_cause.
lpszArchiveName
Özel duruma neden olan nesnenin adını içeren bir dizeyi CArchive
gösterir (varsa).
Gereksinimler
Üst bilgi afx.h
AfxThrowFileException
Bir dosya özel durumu oluşturur.
void AfxThrowFileException(
int cause,
LONG lOsError = -1,
LPCTSTR lpszFileName = NULL);
Parametreler
neden
Özel durumun nedenini gösteren bir tamsayı belirtir. Olası değerlerin listesi için bkz . CFileException::m_cause.
lOsError
Özel durumun nedenini belirten işletim sistemi hata numarasını (varsa) içerir. Hata kodlarının listesi için işletim sistemi kılavuzunuza bakın.
lpszFileName
Özel duruma neden olan dosyanın adını içeren bir dizeyi gösterir (varsa).
Açıklamalar
nedeni işletim sistemi hata koduna göre belirlemek sizin sorumluluğundadır.
Gereksinimler
Üst bilgi afx.h
AfxThrowInvalidArgException
Geçersiz bir bağımsız değişken özel durumu oluşturur.
Sözdizimi
void AfxThrowInvalidArgException( );
Açıklamalar
Geçersiz bağımsız değişkenler kullanıldığında bu işlev çağrılır.
Gereksinimler
Üst bilgi: afx.h
AfxThrowMemoryException
Bir bellek özel durumu oluşturur.
void AfxThrowMemoryException();
Açıklamalar
Temel sistem bellek ayırıcılarına (malloc ve GlobalAlloc Windows işlevi gibi) çağrılar başarısız olursa bu işlevi çağırın. Bellek ayırma başarısız olursa otomatik olarak bir bellek özel durumu oluşturacağından için new
new
çağırmanız gerekmez.
Gereksinimler
Üst bilgi afx.h
AfxThrowNotSupportedException
Desteklenmeyen bir özellik için isteğin sonucu olan bir özel durum oluşturur.
void AfxThrowNotSupportedException();
Gereksinimler
Üst bilgi afx.h
AfxThrowResourceException
Kaynak özel durumu oluşturur.
void AfxThrowResourceException();
Açıklamalar
Bu işlev normalde bir Windows kaynağı yüklenemediğinde çağrılır.
Gereksinimler
Üst bilgi afx.h
AfxThrowUserException
Son kullanıcı işlemini durdurmak için bir özel durum oluşturur.
void AfxThrowUserException();
Açıklamalar
Bu işlev normalde kullanıcıya bir hata bildirildikten hemen sonra AfxMessageBox
çağrılır.
Gereksinimler
Üst bilgi afx.h
AfxThrowOleDispatchException
Bir OLE otomasyon işlevi içinde özel durum atmak için bu işlevi kullanın.
void AFXAPI AfxThrowOleDispatchException(
WORD wCode ,
LPCSTR lpszDescription,
UINT nHelpID = 0);
void AFXAPI AfxThrowOleDispatchException(
WORD wCode,
UINT nDescriptionID,
UINT nHelpID = -1);
Parametreler
wCode
Uygulamanıza özgü bir hata kodu.
lpszDescription
Hatanın sözlü açıklaması.
nDescriptionID
Sözlü hata açıklaması için kaynak kimliği.
nHelpID
Uygulamanızın yardımı için bir yardım bağlamı (. HLP) dosyasını seçin.
Açıklamalar
Bu işleve sağlanan bilgiler, sürüş uygulaması (Microsoft Visual Basic veya başka bir OLE otomasyonu istemci uygulaması) tarafından görüntülenebilir.
Örnek
// Sort is method of automation class CStrArrayDoc
long CStrArrayDoc::Sort(VARIANT* vArray)
{
USES_CONVERSION;
// Type check VARIANT parameter. It should contain a BSTR array
// passed by reference. The array must be passed by reference; it is
// an in-out-parameter.
// throwing COleDispatchException allows the EXCEPINFO structure of
// IDispatch::Invoke() to set
if (V_VT(vArray) != (VT_ARRAY | VT_BSTR))
AfxThrowOleDispatchException(1001,
_T("Type Mismatch in Parameter. Pass a string array by reference"));
// ...
// ...
return 0;
}
Gereksinimler
Üst bilgi afx.h
AfxThrowOleException
türünde COleException
bir nesne oluşturur ve bir özel durum oluşturur.
void AFXAPI AfxThrowOleException(SCODE sc);
void AFXAPI AfxThrowOleException(HRESULT hr);
Parametreler
Sc
Özel durumun nedenini gösteren bir OLE durum kodu.
Hr
Özel durumun nedenini gösteren bir sonuç koduna işleyici.
Açıklamalar
Bir HRESULT'yi bağımsız değişken olarak alan sürüm, sonuç kodunu karşılık gelen SCODE'a dönüştürür. HRESULT ve SCODE hakkında daha fazla bilgi için bkz . Windows SDK'sında COM Hata Kodlarının Yapısı.
Gereksinimler
Üst bilgi afxdao.h
AfxThrowDaoException
Kendi kodunuzdan CDaoException türünde bir özel durum atmak için bu işlevi çağırın.
void AFXAPI AfxThrowDaoException(
int nAfxDaoError = NO_AFX_DAO_ERROR,
SCODE scode = S_OK);
Parametreler
nAfxDaoError
CDaoException::m_nAfxDaoError altında listelenen değerlerden biri olabilecek DAO genişletilmiş hata kodunu temsil eden bir tamsayı değeri.
scode
DAO'dan SCODE türünde bir OLE hata kodu. Daha fazla bilgi için bkz . CDaoException::m_scode.
Açıklamalar
Çerçeve ayrıca öğesini çağırır AfxThrowDaoException
. Çağrınızda, parametrelerden birini veya her ikisini de geçirebilirsiniz. Örneğin, CDaoException::nAfxDaoError içinde tanımlanan hatalardan birini oluşturmak istiyorsanız ancak scode parametresini umursamıyorsanız, nAfxDaoError parametresinde geçerli bir kod geçirin ve scode için varsayılan değeri kabul edin.
MFC DAO sınıfları ile ilgili özel durumlar hakkında bilgi için bu kitaptaki sınıfa CDaoException
ve Özel Durumlar: Veritabanı Özel Durumları makalesine bakın.
Gereksinimler
Üst bilgi afxdb.h
AfxThrowDBException
Kendi kodunuzdan tür CDBException
özel durumu atmak için bu işlevi çağırın.
void AfxThrowDBException(
RETCODE nRetCode,
CDatabase* pdb,
HSTMT hstmt);
Parametreler
nRetCode
Özel durumun oluşturulmasına neden olan hata türünü tanımlayan RETCODE türünde bir değer.
pdb
CDatabase
Özel durumun ilişkilendirildiği veri kaynağı bağlantısını temsil eden nesne işaretçisi.
hstmt
Özel durumun ilişkilendirildiği deyim tanıtıcısını belirten bir ODBC HSTMT tanıtıcısı.
Açıklamalar
Çerçeve, ODBC API işlevine yapılan bir çağrıdan ODBC RETCODE aldığında çağırır AfxThrowDBException
ve RETCODE'u beklenebilir bir hata yerine istisnai bir koşul olarak yorumlar. Örneğin, disk okuma hatası nedeniyle veri erişim işlemi başarısız olabilir.
ODBC tarafından tanımlanan RETCODE değerleri hakkında bilgi için Windows SDK'sında "Durum ve Hata Bilgilerini Alma" adlı 8. Bölüme bakın. Bu kodların MFC uzantıları hakkında bilgi için bkz. CDBException sınıfı.
Gereksinimler
Üst bilgi afx.h
AfxAbort
MFC tarafından sağlanan varsayılan sonlandırma işlevi.
void AfxAbort();
Açıklamalar
AfxAbort
, işlenemeyen yakalanmamış özel durum gibi önemli bir hata olduğunda MFC üye işlevleri tarafından dahili olarak çağrılır. Kurtaramadığınız bir yıkıcı hatayla karşılaştığınızda nadir durumlarda çağırabilirsiniz AfxAbort
.
Örnek
CATCH örneğine bakın.
Gereksinimler
Üst bilgi afx.h
Ayrıca bkz.
Makrolar ve Genel Ayarlar
CException Sınıfı
CInvalidArgException Sınıfı