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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager