Exception [Résolu]

Signaler
Messages postés
9
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
14 janvier 2005
-
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005
-
Bonjour,

J'ai une exception qui fait planter mon programme : il arrive qu'une fonction tente d'utiliser une méthode d'un objet qui vient d'etre détruit, en debug j'ai donc le message suivant:

"Exception non gérée à 0x0043f45a dans HarmoTab.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x6d656c55."

J'aimerais que le programme puisse malgés tout continuer, mais je n'arrive pas à récupérer l'exception, donc si quelqu'un peut m'aider !

R-OnE

7 réponses

Messages postés
9
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
14 janvier 2005

Bon j'ai fini par reussir à l'attraper finalement cette exception. Pour ceux que ca interresse :

DWORD ExceptionFilter(int ExcptID)
{
...
...
return EXCEPTION_EXECUTE_HANDLER;
}

Et autour du code sensible :

__try
{
...
...
}
__except(ExceptionFilter(1))
{
return -1;
}

R-OnE
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Je suis pas sur que cela puisse t'aider mais bon :

Si, lorsqu'une exception se produit dans un bloc try, il est impossible de trouver le bloc catch correspondant à la classe de cette exception, il se produit une erreur d'exécution. La fonction prédéfinie std::terminate est alors appelée. Elle se contente d'appeler une fonction de traitement de l'erreur, qui elle-même appelle la fonction abort de la bibliothèque C. Cette fonction termine en catastrophe l'exécution du programme fautif en générant une faute (les ressources allouées par le programme ne sont donc pas libérées, et des données peuvent être perdues). Ce n'est généralement pas le comportement désiré, aussi est-il possible de le modifier en changeant la fonction appelée par std::terminate.

Pour cela, il faut utiliser la fonction std::set_terminate, qui attend en paramètre un pointeur sur la fonction de traitement d'erreur, qui ne prend aucun paramètre et renvoie void. La valeur renvoyée par std::set_terminate est le pointeur sur la fonction de traitement d'erreur précédente. std::terminate et std::set_terminate sont déclaréee dans le fichier d'en-tête exception.

http://casteyde.christian.free.fr/online/cours_cpp/x3936.html

aller ++
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

"il arrive qu'une fonction tente d'utiliser une méthode d'un objet qui vient d'etre détruit"
ton programme ne peux pas continuer à s'executer s'il y a un déréférencement de pointeur invalide (ça revient à ça). Il faut corriger cette énorme erreur qui ne peut absolument pas etre traité comme une exception (exception C++).
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
Tout a fait d'accord avec plus_plus_fab, il faut absolument corriger cela et non essayer de faire avec.

ciao...
BruNews, MVP VC++
Messages postés
9
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
14 janvier 2005

Meme avec ce que m'as dit luthor, rien a faire, mon prog veut pas la catcher cette exception.
Je crois qui va falloir que je résolve mon problème un peu plus subtilement, mais ca va etre bien plus dure...
Merci quand meme à tous !
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

c'est bien ce que je pensais, tu confonds exceptions C++ et exception du processeur (intel)
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

c'est spécifique à W$, le fait de pouvoir recuperer une violation
d'acces comme un exception C++. D'ailleurs j'ai ouie dire qu'un try{
/*code sensible */ } catch(...){ } permettait de la récupérer ?

De toute façon, ça ne sert à rien !!! Quand tu as une exception
processeur (violation d'acces), tu arretes les dégats, et tu stoppe
tout !