Condividi tramite


CATCH

Definisce un blocco di codice che rileva il primo tipo di eccezione generato nel blocco TRY precedente.

CATCH(exception_class, exception_object_pointer_name )

Parametri

  • exception_class
    Specifica il tipo di eccezione da verificare. Per un elenco delle classi standard di eccezione, vedere la classe CException.

  • exception_object_pointer_name
    Specifica un nome per un puntatore dell'oggetto eccezione che verrà creato dalla macro. È possibile utilizzare il nome del puntatore per accedere all'oggetto eccezione all'interno del blocco CATCH. Questa variabile viene dichiarata automaticamente.

Note

Il codice di elaborazione delle eccezioni può interrogare l'oggetto eccezione, se necessario, per ottenere ulteriori informazioni sulla causa specifica dell'eccezione. Richiama la macro THROW_LAST per scorrere l'elaborazione sul frame esterno dell'eccezione. Terminare il blocco TRY con una macro END_CATCH.

Se exception_class è la classe CException, tutti i tipi di eccezione verranno intercettati. È possibile utilizzare la funzione membro CObject::IsKindOf per determinare quale eccezione specifica è stata generata. Un modo migliore per rilevare vari tipi di eccezioni è utilizzare le istruzioni sequenziali di AND_CATCH, ognuna con un tipo di eccezione diversa.

Il puntatore dell'oggetto eccezione viene creato dalla macro. Non è necessario dichiararlo manualmente.

Nota

Il blocco CATCH viene definito come ambito C++ delineato da parentesi graffe.Se si dichiarano variabili in questo ambito, sono accessibili solo all'interno di tale ambito.Ciò si applica anche a exception_object_pointer_name.

Per ulteriori informazioni sulle eccezioni e sulla macro CATCH, vedere l'articolo Eccezioni.

Esempio

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;
}

Requisiti

Intestazione: afx.h

Vedere anche

Riferimenti

TRY

AND_CATCH

END_CATCH

THROW (MFC)

THROW_LAST

CATCH_ALL

Classe CException

Concetti

Macro e funzioni globali MFC