Ö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ı CExceptionise, 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 CExceptioniş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ı