bonjour a tous
j'ai un petit problemes de c : comment gerer les exceptions comme divbyzero ?
merci
bonjour a tous
j'ai un petit problemes de c : comment gerer les exceptions comme divbyzero ?
merci
Les exception c'est du C++
Tu ne peux pas les faire en C.
En general en C, les fonctions retourne un code d'erreur (style -1 ou NULL) et renseignent la variable errno (dans <errno.h>) avec un code correspondant � l'erreur.
exemple:
#Pour les d�tails voir les tutoriels et cours de formation pour apprendre C : http://c.developpez.com/cours/
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12 define DIV_BY_ZERO 1000 extern int errno; int division (int a, int b) { if (b==0) { errno = DIV_BY_ZERO; return -1 } return a/b; }
En C il est tout � fait possible de g�rer les exceptions. Pour cel� tu dois utiliser les fonctions longjmp et setjmp que tu trouveras dans <setjmp.h>.
Si tu veux une gestion hi�rarchique de tes exceptions dans tes fonctions tu dois �crire un gestionnaire d'exceptions (qui n'est en fait qu'une pile d'exceptions).
Il existe des <exception.h> avec des macros pour faire des try { } catch{ } et des trow ( ), mais je n'en ai pas sous la main.
Voici un document de Laurent Deniau sur les exceptions en C :
http://ldeniau.home.cern.ch/ldeniau/html/exception/exception.html
pour le setjmp ... c pas top c un genre de goto c pas bo .
pour le try catch c du c ansi ???? je crois pas c du c++ ca .
pour gerer un divbyzero ben tu testes le denominateur avant.
Si tu veux gerer la saisie dun entiier ben tu saisies tout en tant que chaine de caracteres et tu convertis.jai fait ca pour un projet c++ et ca passe tres bien .
a+
Je n'aime pas les goto. Mais je ne vois pas trop objections aux setjmp, cela restaure un contexte.Envoy� par krusaf
Les exceptions en C peuvent peut-�tre �tre g�r�es dans des cas exceptionnels pour pouvoir enregistrer des donn�es avant de quitter brutalement un programme par exemple.
Je ne sais pas si setjmp et longjmp sont du C ANSI. Si oui alors le try catch en C c'est du C ANSI. Pour explication les try catch en C sont en fait des macros d�finies qui cachent derri�re un switch().Envoy� par krusaf
Oui bien sur. En g�n�ral je fait comme �a aussi. Mais tout d�pend comment tu veux g�rer tes erreurs. Tu peux �galement utiliser le <errno.h> pour la gestion des erreurs.Envoy� par krusaf
J'utilise setjmp/longjmp dans mon programme, et �a fonctionne tr�s bien. Par
contre, il faut faire attention aux allocations. Exemple simplifi� :
Le probl�me est que la cha�ne 'CopieTxt' ne sera pas lib�r�e en cas d'erreur, il faut donc plut�t coder comme �a :
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 jmp_buf *jump_buffer_courant; void Calcul (char *txt, long Val) { char *CopieTxt = strdup(txt); if (Val == 4) longjmp (*jump_buffer_courant,1); // 1 = présence d'une erreur CopieTxt[0] = '>'; printf ("%s = %li\n",CopieTxt,Val); free (CopieTxt); } void Test () { jmp_buf Buffer; jump_buffer_courant = &Buffer; if (!setjmp(Buffer)) { Calcule ("?Test",4"); } else { printf ("ERREUR !"); } }
---> Les allocations et lib�rations de m�moire doivent se faire en dehors du bloc if (setjmp) !
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 jmp_buf *jump_buffer_courant; void Calcul (char *txt, long Val) { if (Val == 4) longjmp (*jump_buffer_courant,1); // 1 = présence d'une erreur printf ("%s = %li\n",CopieTxt,Val); } void Test () { char *CopieTxt; jmp_buf Buffer; CopieTxt = strdup("?Test"); jump_buffer_courant = &Buffer; if (!setjmp(Buffer)) { CopieTxt[0] = '>'; Calcule ("?Test",4"); } else { printf ("ERREUR !"); } // TOUJOURS exécuté (même en cas d'erreur) free (CopieTxt); }
@+ Haypo
En reprennant le syst�me du try catch. On se rend compte facilement que l'on ne peut pas allouer/d�sallouer proprement dans un try.Envoy� par haypo
Partager