Exceções: obtendo e excluindo exceções
As instruções e os exemplos a seguir mostram como capturar e excluir exceções. Para obter mais informações sobre as palavras-chave try
, catch
e throw
, consulte Melhores práticas do C++ moderno para tratamento de erros e exceções.
Os manipuladores de exceção devem excluir objetos de exceção que eles manipulam, pois a falha ao excluir a exceção causa um vazamento de memória sempre que esse código captura uma exceção.
Seu bloco catch
deve excluir uma exceção quando:
O bloco
catch
gera uma nova exceção.É claro que você não deve excluir a exceção se lançar a mesma exceção novamente:
catch (CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
A execução retorna de dentro do bloco
catch
.
Observação
Ao excluir um CException
, use a função membro Delete
para excluir a exceção. Não use a palavra-chave delete
, pois ela poderá falhar se a exceção não estiver no heap.
Adicionar e excluir exceções
Use a palavra-chave
try
para configurar um blocotry
. Execute qualquer instrução de programa que possa gerar uma exceção dentro de um blocotry
.Use a palavra-chave
catch
para configurar um blococatch
. Coloque o código de tratamento de exceção em um blococatch
. O código no blococatch
será executado somente se o código dentro do blocotry
gerar uma exceção do tipo especificado na instruçãocatch
.O esqueleto a seguir mostra como os blocos
try
ecatch
são organizados normalmente:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CException* e) { // Handle the exception here. // "e" contains information about the exception. e->Delete(); }
Quando uma exceção é lançada, o controle passa para o primeiro bloco
catch
cuja declaração de exceção corresponde ao tipo da exceção. Você pode lidar seletivamente com diferentes tipos de exceções com blocoscatch
sequenciais, conforme listado abaixo:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CMemoryException* e) { // Handle the out-of-memory exception here. e->Delete(); } catch (CFileException* e) { // Handle the file exceptions here. e->Delete(); } catch (CException* e) { // Handle all other types of exceptions here. e->Delete(); }
Para obter mais informações, consulte Exceções: convertendo de macros de exceção MFC.