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++ Discussion :

[debutant] exception: ca ne rentre pas dans le catch


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut [debutant] exception: ca ne rentre pas dans le catch
    bonjour à tous

    je m'initie au try-catch avec le code suivant, mais en debugage ca ne rentre pas dans le catch et ca m'affiche "Une exception non gérée du type 'System.NullReferenceException' s'est produite dans testDllPyxis.exe.
    Informations supplémentaires : La référence d'objet n'est pas définie à une instance d'un objet."

    à l'execution, ca plante purement et simplement...

    avez vous des idees ?

    je developpe sous VS.net 2003

    merci d'avance

    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
     
    #include <iostream>
    #include <stdexcept>
    #include <exception>
    void _tmain()
    {
     
    try
    {
    	int *p;
    	int r=*p;
    	printf("%d",r);
    }
     
    catch ( const std::exception & e)
    {
            std::cerr <<"erreur" << "\n";
    }
     
     
    }

  2. #2
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    j'ai parcouru le forum et cela pourrait venir du mode debug.

    mais la meme chose se produit à l'execution: à ce moment la, windows m'ouvre la fenetre "debogage juste à temps".

    y a t il des options à modifier dans mon projet ?

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ton code n'est pas censé lever la moindre std::exception.

    std::exception et ses dérivées sont générées par les erreurs qui peuvent se produire dans les classes / fonctions de la bibliothèque standard.

    Les exceptions du style division par zéro, lecture d'adresse invalide, etc... sont des exceptions système, pour les récupérer il faut utiliser du code propre à l'API de OS.

  4. #4
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    si je comprends bien, je dois changer ce qu'il ya dans le catch( .....) , mais que dois je mettre ?

    quel est le type d'exception le plus general ? y en a t il un qui regoupe tous les autres? y a t il suffisemment peu de types d'exceptions pour que je puisse mettre un catch pour chacun ?

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si tu veux attraper n'importe quoi, utilise
    Mais là tu n'auras aucune info sur l'exception. Et c'est même pas sûr que ça rattrape les exceptions système.

    Comme je te l'ai dit, il faut sûrement aller fouiller dans les APIs de ton système d'exploitation si tu veux jouer convenablement avec les exceptions système.

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    L'exception système (SEH) est du type unsigned int il me semble.
    Pour les récupérer correctement en C++ standard, le mieux est de les attraper et de les convertir :
    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
     
    class SException : public std::exception {
    public :
    	SException(UINT nSeCode, _EXCEPTION_POINTERS *pExcPointers);
    	virtual const char* what() const throw();
    private:
    	static char sBuffer[256];
    };
     
    #define CASE(nSeCode) case EXCEPTION_##nSeCode: sprintf_s(sBuffer, 256, "Exception %s (0x%.8x) at address 0x%p.", #nSeCode, EXCEPTION_##nSeCode, pExcPointers->ExceptionRecord->ExceptionAddress); break;
     
    const char *SException::what() const throw() {
    	return sBuffer;
    }
     
    SException::SException(UINT nSeCode, _EXCEPTION_POINTERS *pExcPointers) {
    	switch (nSeCode) {
    		CASE(ACCESS_VIOLATION)
    		CASE(DATATYPE_MISALIGNMENT)
    		CASE(BREAKPOINT)
    		CASE(SINGLE_STEP)
    		CASE(ARRAY_BOUNDS_EXCEEDED)
    		CASE(FLT_DENORMAL_OPERAND)
    		CASE(FLT_DIVIDE_BY_ZERO)
    		CASE(FLT_INEXACT_RESULT)
    		CASE(FLT_INVALID_OPERATION)
    		CASE(FLT_OVERFLOW)
    		CASE(FLT_STACK_CHECK)
    		CASE(FLT_UNDERFLOW)
    		CASE(INT_DIVIDE_BY_ZERO)
    		CASE(INT_OVERFLOW)
    		CASE(PRIV_INSTRUCTION)
    		CASE(IN_PAGE_ERROR)
    		CASE(ILLEGAL_INSTRUCTION)
    		CASE(NONCONTINUABLE_EXCEPTION)
    		CASE(STACK_OVERFLOW)
    		CASE(INVALID_DISPOSITION)
    		CASE(GUARD_PAGE)
    		CASE(INVALID_HANDLE)
    	default:
            sprintf_s(sBuffer, 256, "Unknown exception.");
    		break;
    	}
        m_Message = sBuffer;
    }
     
    void SeTranslator(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers) {
    	throw SException(nSeCode, pExcPointers);
    }
    puis ajouter au début du programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _set_se_translator(SeTranslator);

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Déjà, tu compiles en ce moment en code managé : Du code C++ natif ne lance pas de NullReferenceException (qui est une exception .Net) mais une exception Win32 STATUS_ACCESS_VIOLATION qui n'est pas catchable par le système d'exception du C++ : Il faut utiliser du Structured Exception Handling (SEH) à la place.
    Donc:
    • Si tu veux rester en .Net, essaie en changeant ton catch en :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      catch ( System::Exception ^ e)
    • Si tu veux catcher l'exception Win32, renseigne-toi sur le SEH, notamment les mots-clé __try et __except et n'oublie pas de modifier les options du projet pour supprimer "Common Language Runtime support".


    Edit: Je ne connaissais pas _set_se_translator. Intéressant, de pouvoir convertir une exception Win32 en exception C++...
    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. IE ne rentre pas dans ma fonction Javascript
    Par akrogames dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 14/10/2008, 22h34
  2. Ma page ne rentre pas dans la fonction Page_Load
    Par Titi41 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 30/05/2008, 15h09
  3. Ne rentre pas dans la boucle
    Par choko62 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/06/2007, 14h54
  4. le prog ne rentre pas dans la boucle
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2006, 06h45
  5. ça rentre pas dans la boucle pendant l'exécution
    Par djouahra.karim1 dans le forum Bases de données
    Réponses: 9
    Dernier message: 15/01/2005, 15h41

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