août
2007
Des fois, il peut etre utile de pouvoir intercepter une exception managée à partir d’un code natif.
Soit le programme suivant qui simule, grace aux pragma unmanaged et managed, une intéraction entre un code natif et un code managé :
void fonctionManagee()
{
throw gcnew Exception("Exception managée");
}
#pragma unmanaged
void fonctionNative()
{
fonctionManagee();
}
#pragma managed
int main()
{
fonctionNative();
return 0;
}
Si on exécute cet exemple, on obtient un crash de l’application à cause de la levée d’exception dans la méthode managée.
Le premier reflexe est d’utiliser un try catch … mais … quel type d’exception attraper ? Une solution pourrait être de tout attraper, avec une construction de ce genre :
{
try
{
fonctionManagee();
}
catch (...)
{
std::cout << "N'importe quelle exception est attrapee, meme managee" << std::endl;
}
}
Cette construction a l’avantage de permettre d’intercepter l’exception levée dans la fonction managée depuis le code natif, mais a l’inconvénient de tout intercepter, à cause de la construction « … » suivant le catch.
La solution est d’utiliser un block try except, comme ci-dessous :
{
__try
{
fonctionManagee();
}
__except(GetExceptionCode() == 0xE0434F4D ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
std::cout << "Uniquement les exceptions managees sont attrapees" << std::endl;
}
}
0xE0434F4D est le code d’erreur SEH correspond. (pour l’anectode, 0xE0434F4D correspond à 0xE0+ »COM » (= ‘àCOM’), car à l’origine, le CLR a été appelé COM+ 2.0. Le nom du projet a changé mais pas les codes d’exception)
L’inconvénient est qu’on ne peut pas avoir d’information sur l’exception, comme dans notre cas, le message d’exception levé.
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007