Exceptions : À l'aide de la macro MFC et les exceptions C++
Cet article explique les considérations pour écrire du code qui utilise les macros de gestion des exceptions MFC et les mots clés de gestion des exceptions C++.
Cet article décrit les rubriques suivantes :
Mots clés et macros d'exception de mélange
Bloc try dans des blocs catch
Mots clés et macros d'exception de mélange
Vous pouvez combiner des macros d'exception MFC et les mots clés d'exception C++ dans la même programme.Mais vous ne pouvez pas mélanger des macros MFC avec des mots clés d'exception C++ dans le même bloc car les macros suppriment des objets exception automatiquement lorsqu'elles sont hors de portée, tandis que le code à l'aide de les mots clés de gestion des exceptions ne le fait pas.Pour plus d'informations, consultez l'article exceptions : Interception et supprimant des exceptions.
La différence principale entre macros et les mots clés est que les macros « automatiquement » supprimer une exception interceptée lorsque l'exception est hors de portée.Code à l'aide de les mots clés n'est pas le cas ; les exceptions interceptées dans un bloc catch doivent être explicitement supprimées.Les macros de mélange les mots clés et de l'exception C++ peuvent entraîner des fuites de mémoire lorsqu'un objet exception n'est pas supprimé, ou l'altération du tas lorsqu'une exception est supprimée deux fois.
Le code suivant, par exemple, utiliser le pointeur d'exception :
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
throw; // Invalid attempt to throw exception
// to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is invalid because
// it was deleted in the inner catch block.
}
END_CATCH
Le problème se produit car e est supprimé lorsque l'exécution passe en dehors de le bloc « internal » de CATCH .En utilisant la macro d' THROW_LAST au lieu de l'instruction de THROW fera pour accepter le bloc « externe » de CATCH un pointeur valide :
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
THROW_LAST(); // Throw exception to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is valid because
// THROW_LAST() was used.
}
END_CATCH
Bloc try dans des blocs catch
Vous ne pouvez pas lever l'exception actuelle d'un bloc de try qui est à l'intérieur d'un bloc de CATCH .l'exemple suivant est valide :
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
try
{
throw; // Wrong. Causes e (the exception
// being thrown) to be deleted.
}
catch(CException* exception)
{
exception->ReportError();
}
}
END_CATCH
Pour plus d'informations, consultez l' exceptions : Contenu de révision d'exception.