begin process at 2012 05 30 19:20:29
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

MFC

 > 

Try/Catch


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Try/Catch

jeudi 24 juin 2010 à 19:12:35 | Try/Catch

Jojo73450

Salut à tous !

Un problème tout bête mais j'ai passé la journée dessus (argg!!!!) alors je me décide à poster, ne trouvant aucune réponse...

Application MFC, mon application enregistre un fichier à partir d'informations contenues dans une base MySql. Voilà très grossièrement le schéma mis en place :

try
{
//Ouverture
CStdioFile file;
file open(monfichier.txt);

Boucle:
{
//Requete SQL qui récupère des informations

//Enregistrement des informations
file.WriteString(string_infos);
file.Flush();
}

file.Close();
}
catch(...)
{
//traitement de l'exception : affichage de l'erreur

}

Le fichier est en fait écrit sur une clé USB. La problématique est : "comment ne pas faire planter l'appli si on arrache la clé USB pendant l'export des informations ?"
J'ai mis en place le try/catch afin de récupérer toutes les exceptions, mais au lieu de ca mon appli crash si j'arrache la clé USB. L'appli ne rentre pas du tout dans le catch.

Une idée ?

D'avance merci à tous pour vos retours d'expérience !

Joël
jeudi 24 juin 2010 à 23:52:11 | Re : Try/Catch

CptPingu

Administrateur CodeS-SourceS
Une exception ne sert pas à attraper une routine qui plante !
Un try catch n'est que pour attraper une exception levée volontairement.

Si tu veux attaper un plantage (communément appelé "segfault"), il te faut détecter le signal d'un segfault.
Sous Linux, c'est très simple à faire, grâce à la méthode sigaction de signal.h
Sous Windows, je ne sais pas, mais tu peux faire quelque recherche sur l'équivalent de sigaction sous Windows.

_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
vendredi 25 juin 2010 à 09:41:43 | Re : Try/Catch

louis14


Bonjour,
Si tu as une solution, je suis preneur aussi

louis
vendredi 25 juin 2010 à 10:07:34 | Re : Try/Catch

CptPingu

Administrateur CodeS-SourceS
Il me semble que signal est aussi sous Windows.
Donc voici un petit exemple, à tester.

On pose un handler, et en cas de plantage, on revient au moment ou on a posé une "protection".
Je tiens tout de même à souligner le fait que c'est une très très mauvaise pratique, et qu'il vaut mieux investiguer sur l'origine de l'erreur plutôt que de la contourner !

Code C/C++ :
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <setjmp.h>

static jmp_buf jump;

void handler()
{
  printf("Segmentation fault catched !\n");
  longjmp(jump, 1);
}

int main(void)
{
  printf("Program begin\n");

  signal(SIGSEGV, handler);
  if (!setjmp(jump) )
  {
    char* p = NULL;
    strcpy(p,"SEGFAULT, p is not allocated");
    printf("%s", p);
  }

  printf("Program is here\n");

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
vendredi 25 juin 2010 à 23:26:54 | Re : Try/Catch

Jojo73450

Salut

Ben l'erreur est "connue" : la clé USB est arraché pendant la phase d'écriture, donc quand je fais mon WriteString et le Flush, une CFileException est levée.
Le reste du code est clean, ça marche impec. Mis à part cette histoire d'arrachage de clé....
Le problème serait donc de savoir comment récupérer systématiquement l'exception et que Windows ne termine pas l'application.
Intéressant ton exemple CptPingu, a essayer.

Joël

Ps: je précise que je l'appli tourne sur XP Embedded.
samedi 26 juin 2010 à 11:02:30 | Re : Try/Catch

CptPingu

Administrateur CodeS-SourceS
Dans ce cas, si une exception est levée, ça m'étonne que tu ne l'ai pas attraper avec un try catch all, du genre:
Code C/C++ :
try
{
//...
}
catch(...)
{
}


Passe le sous un debugger, pour vérifier ce qui arrête ton programme.

_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
samedi 26 juin 2010 à 11:33:14 | Re : Try/Catch

Jojo73450

Salut

Un mauvais signe (pour moi !) : une ancienne version du soft qui marchait très bien (y compris le coup de l'arrachage de la clé) ne marche plus. Après comparaison des codes sources, on avait bien aussi le try/catch(...), la seule différence se situe au niveau du traitement SQL (moins de data avec la version précédente du soft, donc moins de code dans le try{}).

Donc le coup du try/catch(...) marchait mais ne marche plus. Y aurait une config à faire au niveau de Windows pour récupérer toutes les exceptions ? (Base de registre ?)

Joël
lundi 28 juin 2010 à 11:20:37 | Re : Try/Catch

CptPingu

Administrateur CodeS-SourceS

Y aurait une config à faire au niveau de Windows pour récupérer toutes les exceptions ? (Base de registre ?)


Le "try ... catch" est un mécanisme du C++ et n'a absolument rien à voir avec l'OS.

En revanche, il est important de savoir pourquoi ton programme plante. Essaie de passer ton programme dans un débugger pour trouver l'origine du problème. (gdb, le debugger de visual, gdb embarqué dans QTCreator, ...)

Si ton programme est multi-plateforme (je suis sous Linux), je peux aussi jeter un coup d'oeil.

_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
lundi 28 juin 2010 à 17:14:13 | Re : Try/Catch

Jojo73450

Salut CptPingu !

Merci de ton aide, mais c'est au final résolu. J'ai fais un peu de ménage dans le code, et déplacé le try/catch(...). Je ne vois pas la différence entre avant et après si ce n'est qu'il y a au final moins de code dans le try{}... (pas beaucoup moins).

En pensant configuration, je ne pensait pas au mécanisme du try/catch lui même, mais à la levée des exceptions, qui, sauf erreur, sont faites par l'OS. Si l'OS ne remonte pas une exception et termine l'application sans se poser de question, try/catch ou pas try/catch, le programme "plante". Non ?

Encore merci pour ton aide !

Joël

PS: Louis, si tu es toujours, là, essaie de déplacer ton try/catch(...)


Cette discussion est classée dans : file, try, informations, catch, clé


Répondre à ce message

Sujets en rapport avec ce message

try catch [ par raphael59540 ] <img src="/imgs2/smile_question.gif" Gestion des execptions et GCC [ par skirby ] Bonjour,J'aurais voulu savoir si il était possible de gérer les execptions grace à l'instruction Try / Catch avec le compilateur GCC ?Plus précisément afficher le contenu d'une 'exception en c++ [ par wislam2007 ] Salut j'ai un try catch que je doit gérer : [code=cpp]try{ }catch(exception e){ // je veux afficher le contenu de l'exception : je fait e.what() mais Trois erreurs: TypeNameExpected ; Catch statement missing ) ; Compound statement missing }. [ par ProgVal ] void __fastcall TForm1::Button1Click(TObject *Sender){    try    {        String nf;        nf="C:\Documents and Settings\raymond\Menu Démarrer\Progra identification d'un driver [ par je_ne_viens_qu1_fois ] Rebonjour et excusez moi d'avance si je parais "polluer" le forum.Mon problème est le suivant: je dois lire dans un périphérique USB.J'utilise la fonc problème lors de compilation [ par fabrice91 ] Bonjour,J'ai un programme avec des declarations telles que :#include #include et le compilateur me met des erreurs du style: fatal error C1083 : Canno probleme fopen, fpuc, fgetc [ par ZEROCOOL492 ] salut tout le mondevoila j'ai un probleme avec ce code :file = fopen(file_location, "r+b")input = fgetc(file);fputc(output, file);jai volontairement t demande de clée d'activation sur mon prog [ par jipe32 ] Salut à tous, comment faire pour que l'utilisateur puisse activer mon prog seulement si il possède une clé d'activation. Par exemple, il télécharge mo Impression en MFC [ par ketchupy45 ] Bonjour, je programme sous visual studio .net 2003 et j'utilise les MFC.Dans le cadre de cette source http://www.cppfrance.com/code.aspx?ID=35554Je vo Problème d'insértion de la clé dans un arbre binaire de recherche récursivement [ par polobou ] [b]BONJOUR[/b][^^happy8] Comment insérer la clé dans un arbre binaires de recherche récursivement sans utiliser par exemple un tableau [b]Merci[/b][


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,343 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales