Salut on m’a dit que les assertions peuvent être utile pour savoir exactement ou une erreur s’est produite dans le programme. Comment on s’en sert :D ?
Merci.
Version imprimable
Salut on m’a dit que les assertions peuvent être utile pour savoir exactement ou une erreur s’est produite dans le programme. Comment on s’en sert :D ?
Merci.
Cela devrait te convenir: http://emmanuel-delahaye.developpez....tes.htm#assert ;)
Le piege avec les assertions c'est de les confondre avec la gestion d'erreurs.
Il s'agit juste de reperer des erreurs de programmation, si le test effectué par l'assertion est trop dependant de données "externes" (ex: ce que rentre un utilisateur), c'est pas bon
En effet, les assertions servent typiquement à tester des invariants. Si tu as fait un peu de génie logiciel, de conception, tu sais ce qu'est le contrat d'une fonction, ce que sont les préconditions et postconditions. Les assertions sont bien pour vérifier que ces conditions sont respectées, indépendamment de toute influence extérieure.
L'assertion sert à tester quelque chose qui ne peut pas échouer. Si ça peut échouer, ce n'est pas une assertion qu'il faut mettre, mais une vraie gestion d'erreurs.
Est ce que cet exemple est correct ?
Code:
1
2
3
4
5
6
7
8
9
10
11 FILE* ouvrir_fichier() { FILE *fichier_section=NULL; fichier_section=fopen("section.dat","w"); //teste le pointer fichier_section et stoppe l'exectuion //si il est égal a NULL assert(fichier_section!=NULL); return fichier_section;
C'est typiquement un mauvais exemple. Une erreur à l'ouverture d'un fichier n'est pas une erreur de conception, elle arrivera forcément un jour ou l'autre.
Dis toi bien que les assertions sont un outil de debug; elles sont supprimées quand on passe en release. Dans ton cas cela signifie qu'il n'y aura plus de test.
Non : Il est normal qu'une ouverture de fichier échoue (influence extérieure).
Ceci est plus correct:
Là, l'assertion ne peut pas échouer. Si elle échoue quand même, c'est que quelqu'un a oublié de tester fich avant d'appeler tester_fichier.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 /** \brief Extrait des données du fichier ouvert. \param fichier_section : flux d'où extraire les données. Ne doit pas être NULL. */ void traiter_fichier(FILE *fichier_section) { assert(fichier_section!=NULL); /* ... */ } void UneFonction(void) { FILE *fich = fopen( ... ); if(fich != NULL) { traiter_fichier(fich); fclose(fich); } }
et on ne peut pas utiliser un autre truc de gestion d'erreurs genre si le l'ouverture a echoué alors il stoppe le programme et affiche un message d'alerte ?
si bien sûr..
:mouarf:Code:
1
2
3
4
5 if (fichier_section == NULL ) { fprintf ( stderr, "ERREUR OUVERTURE FICHIER"); return ; /* exit(1) si tu veux sortir */ }
c quoi stderr ?:?
8O 8O C'est le flux standard d'erreur ... les trois flux standard:Citation:
Envoyé par isoman
- stdin
- stdout
- stderr