Exceptions : interception et suppression d'exceptions
Les instructions et exemples suivants vous montrent comment intercepter et supprimer des exceptions. Pour plus d’informations sur les bonnes pratiques relatives aux exceptions et throw
aux mot clé, consultez les meilleures pratiques modernes en C++ pour la try
catch
gestion des exceptions et des erreurs.
Vos gestionnaires d’exceptions doivent supprimer les objets d’exception qu’ils gèrent, car l’échec de la suppression de l’exception provoque une fuite de mémoire chaque fois que ce code intercepte une exception.
Votre catch
bloc doit supprimer une exception lorsque :
Le
catch
bloc lève une nouvelle exception.Bien sûr, vous ne devez pas supprimer l’exception si vous lèvez à nouveau la même exception :
catch (CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
L’exécution retourne à partir du
catch
bloc.
Remarque
Lors de la suppression d’un CException
, utilisez la Delete
fonction membre pour supprimer l’exception. N’utilisez pas la delete
mot clé, car elle peut échouer si l’exception n’est pas sur le tas.
Pour intercepter et supprimer des exceptions
Utilisez la
try
mot clé pour configurer untry
bloc. Exécutez les instructions de programme susceptibles de lever une exception dans untry
bloc.Utilisez la
catch
mot clé pour configurer uncatch
bloc. Placez le code de gestion des exceptions dans uncatch
bloc. Le code ducatch
bloc est exécuté uniquement si le code dans letry
bloc lève une exception du type spécifié dans l’instructioncatch
.Le squelette suivant montre comment et
catch
lestry
blocs sont normalement organisés :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(); }
Lorsqu’une exception est levée, le contrôle passe au premier
catch
bloc dont la déclaration d’exception correspond au type de l’exception. Vous pouvez gérer de manière sélective différents types d’exceptions avec des blocs séquentielscatch
, comme indiqué ci-dessous :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(); }
Pour plus d’informations, consultez Exceptions : Conversion à partir de macros d’exception MFC.