Exceptions : Convertir des macros d'exception MFC
Cette rubrique avancée.
Cet article explique comment convertir le code existant écrit avec les macros Microsoft Foundation Class) — TRY, CATCH, THROW, etc. pour utiliser les mots clés de gestion des exceptions C++ try, catch, et throw.Les rubriques traitées ici sont les suivantes :
Avantages de conversion
Conversion du code avec des macros d'exception pour utiliser des exceptions C++
Avantages de conversion
Vous n'avez probablement pas besoin de convertir le code existant, bien que vous devez connaître les différences entre les implémentations macro dans la version 3,0 de MFC et les implémentations dans les versions antérieures.Ces différences et modifications suivantes dans le comportement du code sont traités dans exceptions : Modifications apportées aux macros d'exception de la version 3,0.
Les principaux avantages de convertir sont :
Le code qui utilise les compilations de mots clés de gestion des exceptions C++ à un .EXE légèrement plus petit ou à la .DLL.
Les mots clés de gestion des exceptions C++ sont plus polyvalents : Ils peuvent gérer les exceptions de n'importe quel type de données qui peuvent être copiées (int, float, char, etc.), alors que les macros gèrent les exceptions que de classe CException et des classes dérivées de celle-ci.
La principale différence entre macros et les mots clés s'ce code à l'aide de les macros « automatiquement » supprime 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, vous devez supprimer explicitement une exception interceptée.Pour plus d'informations, consultez l'article exceptions : Interception et supprimant des exceptions.
Une autre différence est syntaxe.La syntaxe des macros et des mots clés diffère à trois cas :
Macro arguments et déclarations d'exception :
Un appel de macro de CATCH a la syntaxe suivante :
exception_class deCATCH(, exception_object_pointer_name**)**
Notez la virgule entre le nom de la classe et le nom du pointeur d'objet.
La déclaration d'exception pour le mot clé de catch utilise cette syntaxe :
exception_typeexception_name**)decatch(**
Cette instruction de déclaration d'exception indique le type d'exception que le bloc catch gère.
Délimitation des blocs catch :
Avec les macros, la macro de CATCH (avec ses arguments) démarre le premier bloc catch ; la macro d' AND_CATCH démarrer les blocs catch suivants, et le d' END_CATCH termine la séquence de blocs catch.
Avec les mots clés, le mot clé de catch (avec sa déclaration d'exception) commence chaque bloc catch.Il n'y a aucun équivalent à la macro d' END_CATCH ; le bloc catch se termine par son accolade fermante.
l'expression de jet :
Les macros utilisent le lever d' THROW_LAST l'exception actuelle.Le mot clé d' throw , sans argument, a le même effet.
Effectuer la conversion
Pour convertir code à l'aide de macros pour utiliser les mots clés de gestion des exceptions C++
Recherchez toutes les occurrences des macros MFC TRY, CATCH, AND_CATCH, END_CATCH, THROW, et THROW_LAST.
Remplacez ou supprimez toutes les occurrences des macros suivantes :
TRY (remplacez-le par try)
CATCH (remplacez-le par catch)
AND_CATCH (remplacez-le par catch)
END_CATCH (suppression il)
THROW (remplacez-le par throw)
THROW_LAST (remplacez-le par throw)
Modifiez la macro arguments afin qu'ils forment des déclarations non valides d'exception.
Par exemple, remplacez
CATCH(CException, e)
en
catch(CException* e)
Modifiez le code dans les blocs catch afin qu'elle supprime les objets exception si nécessaire.Pour plus d'informations, consultez l'article exceptions : Interception et supprimant des exceptions.
Voici un exemple de code de gestion des exceptions à l'aide de macros d'exception MFC.Étant donné que le code dans l'exemple suivant utilise les macros, l'exception e est supprimée automatiquement :
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
if (m_bPassExceptionsUp)
THROW_LAST();
if (m_bReturnFromThisFunction)
return;
// Not necessary to delete the exception e.
}
END_CATCH
Le code dans l'exemple suivant utilise les mots clés d'exception C++, donc l'exception doit être supprimée explicitement :
try
{
// Do something to throw an exception.
AfxThrowUserException();
}
catch(CException* e)
{
if (m_bPassExceptionsUp)
throw;
if (m_bThrowDifferentException)
{
e->Delete();
throw new CMyOtherException;
}
if (m_bReturnFromThisFunction)
{
e->Delete();
return;
}
e->Delete();
}
Pour plus d'informations, consultez l' exceptions : À l'aide de la macro MFC et les exceptions C++.