IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Managed .NET exception info dans un __try/__except


Sujet :

C++/CLI

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre tr�s actif

    Profil pro
    �tudiant
    Inscrit en
    D�cembre 2004
    Messages
    499
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 499
    Par d�faut Managed .NET exception info dans un __try/__except
    Bonjour,

    J'ai une solution pour r�cup�rer l'exception .NET dans un __try/__except (donc handler d'exception non manag�).

    Il s'agit de relancer (dans un try/catch .NET) l'exception avec un RaiseException.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    #include <Windows.h>
    #define DOT_NET_EXCEPTION_CODE 0xE0434352
     
    void RetrieveDotNetExceptionInfo(_EXCEPTION_RECORD * ExceptionRecord) {
    	try {
    		RaiseException(ExceptionRecord->ExceptionCode,
    					   ExceptionRecord->ExceptionFlags,
    					   ExceptionRecord->NumberParameters,
    					   ExceptionRecord->ExceptionInformation);
    	} catch(System::Exception ^E) {
    		System::Console::WriteLine(E->ToString());
    	}
    }
     
    #define KindOfDotNetException 3
    void DoSomeManagedThrow() {
    	switch (KindOfDotNetException) {
    		case 1:
    			{ throw gcnew System::Exception("une exception .NET"); }
    		case 2:
    			{ System::Int32 ^i = 32;
    			  System::String^ s = (System::String^)i; }
    		case 3:
    			{ System::Int32 ^i = nullptr;
    			  i->GetType(); }
    		case 4: // this one doesn't work --> infinte loop (it's a bug of VS2010 compiler ?)
    			{ System::Int32 ^i = nullptr;
    			  i->ToString(); }
    	}
    }
     
    #pragma unmanaged 
     
    int HandleException(void *ptr) {
    	_EXCEPTION_RECORD * ExceptionRecord = ((_EXCEPTION_POINTERS*)ptr)->ExceptionRecord;
    	switch (ExceptionRecord->ExceptionCode) {
    		case DOT_NET_EXCEPTION_CODE:
    			RetrieveDotNetExceptionInfo(ExceptionRecord);
    			return EXCEPTION_EXECUTE_HANDLER;
    		default:
    			/***/ ;
    	}
    	return EXCEPTION_CONTINUE_SEARCH;
    }
     
    void UnmanagedTry() {
    	__try {
    		DoSomeManagedThrow();
    	} __except(HandleException(_exception_info())) {
    	}
    }
    #pragma managed
     
    int main(array<System::String ^> ^args)
    {
    	/* to compare with normal .NET exception catch :
            try {
    		DoSomeManagedThrow();
    	} catch(System::Exception ^E) {
    		System::Console::WriteLine(E->ToString());
    	}
    	System::Console::WriteLine(""); */
    	UnmanagedTry();
    	system("pause");
        return 0;
    }
    Si quelqu'un connait une autre solution pour ce probl�me �a m'int�resserait de la conna�tre !

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    C'est assez impressionnant, m�me si d'instinct je chercherais plut�t � tout traiter en .Net (et transformer les exceptions SEH en exceptions .Net plut�t que l'inverse).

    Je suis surpris que deux NullReferenceExceptions ne se comportent pas pareil, par contre. Il pourra�t �tre int�ressant de voir le CIL g�n�r�.

    PS: Tu devrais utiliser les constantes EXCEPTION_EXECUTE_HANDLER, EXCEPTION_CONTINUE_SEARCH etc. dans ta fonction HandleException (d'ailleurs, ce n'est pas un Exception Handler, mais un Exception Filter), au lieu de nombres magiques 0 et 1.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Utilisation des classes manag�es .net dans PHP
    Par Hinault Romaric dans le forum Langage
    R�ponses: 2
    Dernier message: 19/02/2011, 10h46
  2. [VB.NET] Recherche Info dans Active Directory
    Par Vlat dans le forum Windows Forms
    R�ponses: 2
    Dernier message: 30/12/2005, 15h29
  3. R�ponses: 2
    Dernier message: 19/01/2004, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo