Exceções: Gerar exceções de suas próprias funções
É possível usar o paradigma de manipulação de exceção do MFC unicamente para capturar exceções lançadas por funções no MFC ou outras bibliotecas.Além para capturar exceções lançadas pelo código de biblioteca, você pode lançar exceções de seu próprio código, se você estiver escrevendo funções podem encontrar condições excepcionais.
Quando uma exceção é lançada, a execução da função atual é interrompida e vai diretamente para o catch bloco de quadro de exceção interna.O mecanismo de exceção ignora o caminho de saída normal de uma função.Portanto, você deve ser exclua esses blocos de memória que seriam excluídos em uma saída normal.
Lançar uma exceção
Use uma das funções de auxiliar MFC, como AfxThrowMemoryException.Essas funções lançam um objeto de exceção pré-distribuídos do tipo apropriado.
No exemplo a seguir, uma função tenta alocar dois blocos de memória e lança uma exceção se qualquer alocação falhar:
{ 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 ); }
Se a primeira alocação falhar, você pode simplesmente lançar a exceção de memória.Se a primeira alocação é bem-sucedida, mas segundo falha, você deve liberar o primeiro bloco de alocação antes de lançar a exceção.Se ambas as alocações tiver êxito, você pode prosseguir normalmente e liberar os blocos ao sair da função.
-ou-
Use uma exceção definida pelo usuário para indicar uma condição de problema.Você pode lançar um item de qualquer tipo, até mesmo uma classe inteira, como a exceção.
O exemplo a seguir tenta reproduzir um som através de um dispositivo de som wave e lança uma exceção se houver uma falha.
#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; }
Observação |
---|
Do MFC tratamento padrão de exceções se aplica apenas aos ponteiros para CException objetos (objetos e CException-classes derivadas).O exemplo acima ignora o mecanismo de exceção do MFC. |