Utilisation de try catch en C ou C++
d-bax
-
lolo -
lolo -
Bonjour,
Je voudrais savoir comment on utilise le try catch car je n arrive pas a l utiliser. J ai voulu le tester avec le petit programme ci dessous mais il ne se passe rien.
J utilise gcc pour compiler car je suis sous Unix et je me demande s il ne faut utiliser une option de compil particuliere ? ou inclure un fichier ?
J ai trouver sur internet qu il fallait inclure <exception.h> mais il ne le connait pas !
Pouvez-vous maider ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main (void){
try {
memset(0,0,1);
}
catch ( ... ) {
printf("catch...\n");
throw; // avec ou sans throw ca marche pas
}
printf("rien\n");
}
Je voudrais savoir comment on utilise le try catch car je n arrive pas a l utiliser. J ai voulu le tester avec le petit programme ci dessous mais il ne se passe rien.
J utilise gcc pour compiler car je suis sous Unix et je me demande s il ne faut utiliser une option de compil particuliere ? ou inclure un fichier ?
J ai trouver sur internet qu il fallait inclure <exception.h> mais il ne le connait pas !
Pouvez-vous maider ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main (void){
try {
memset(0,0,1);
}
catch ( ... ) {
printf("catch...\n");
throw; // avec ou sans throw ca marche pas
}
printf("rien\n");
}
A voir également:
- Catch exception c
- Appliquez à tous les paragraphes du document à télécharger, à l’exception des titres et des sous-titres, la mise en forme suivante : - Guide
- A java exception has occurred - Forum Minecraft
- A java exception has occurred (( minecraft.serv )) - Forum Minecraft
- Une exception non gérée s'est produite dans votre application - Forum Word
- Erreur d'application : une exception côté client s'est produite (consultez la console du navigateur pour plus d'informations). - Forum Google Chrome
13 réponses
Tu dis que cela lui pose pas de problème avec x= 7, mais on rattrape l'exception donc il ne doit qu'afficher "x trop grand".
Dans ton code, tu avais mis throw. Throw sert à lancer une exception, donc si tu mets cela dans le bloc du catch, tu relance une exception et là, il devrait ne pas être content.
Dans mes souvenirs, il faut mettre l'instance de l'exception que tu veux lancer après le throw.
Dans ton code, tu avais mis throw. Throw sert à lancer une exception, donc si tu mets cela dans le bloc du catch, tu relance une exception et là, il devrait ne pas être content.
Dans mes souvenirs, il faut mettre l'instance de l'exception que tu veux lancer après le throw.
Hello !
Exemple (qui marche) :
#include <iostream>
using namespace std;
int main()
{
int x = 7;
try
{
if (x == 7) throw x;
else { cout << "X est OK" << endl; }
}
catch (int)
{
cerr << "Exception INT détectée." << endl;
}
catch (...)
{
cerr << "Exception indéfinie." << endl;
}
return 0;
}
Dans cet exemple, on décide de lever une exception avec un entier (x)
qui a une valeur illégale (7). Si x est correctement initialisée, il n'y a pas levée d'exception.
Est-ce que c'est plus clair ?
Exemple (qui marche) :
#include <iostream>
using namespace std;
int main()
{
int x = 7;
try
{
if (x == 7) throw x;
else { cout << "X est OK" << endl; }
}
catch (int)
{
cerr << "Exception INT détectée." << endl;
}
catch (...)
{
cerr << "Exception indéfinie." << endl;
}
return 0;
}
Dans cet exemple, on décide de lever une exception avec un entier (x)
qui a une valeur illégale (7). Si x est correctement initialisée, il n'y a pas levée d'exception.
Est-ce que c'est plus clair ?
Voici un exemple :
int x=7;
int [4] tabInt;
try
{
tabInt[x] = 2;
} catch (IndexOutOfRangeException e)
{
printf("x trop grand");
}
Dans cet exemple, on essaye de mettre la valeur deux dans le 7-ième élèment du tableau tabInt. Or il y a que 4 élèments dans ce tableau, alors une exception du type IndexOutOfRangeException est lancée et dans ce cas, on affiche sur la console "x trop grand".
Si tu re-essaye avec "int x = 2;", aucune exception est levée car on se retrouve pas en dehors du tableau.
Bon courage.
int x=7;
int [4] tabInt;
try
{
tabInt[x] = 2;
} catch (IndexOutOfRangeException e)
{
printf("x trop grand");
}
Dans cet exemple, on essaye de mettre la valeur deux dans le 7-ième élèment du tableau tabInt. Or il y a que 4 élèments dans ce tableau, alors une exception du type IndexOutOfRangeException est lancée et dans ce cas, on affiche sur la console "x trop grand".
Si tu re-essaye avec "int x = 2;", aucune exception est levée car on se retrouve pas en dehors du tableau.
Bon courage.
Il faut donc connaitre les noms des exceptions ? Et try, il sert à essayer d'exécuter une portion de code pour voir si elle marche (et si elle ne marche pas, catch informe l'utilisateur) ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut.
Juste pour dire que des fois, dépasser la taille d'un tableau ne génere pas d'erreurs, par contre la valeur lu est ... indéterminer, pour ne pas dire aléatoire.
Je n'ai jamais compris ce phénomène, je l'ai juste observé souvent sous UNIX. Et j'en suis certain vu les heures passer à debugger !!
Juste pour dire que des fois, dépasser la taille d'un tableau ne génere pas d'erreurs, par contre la valeur lu est ... indéterminer, pour ne pas dire aléatoire.
Je n'ai jamais compris ce phénomène, je l'ai juste observé souvent sous UNIX. Et j'en suis certain vu les heures passer à debugger !!
Salut, tardif.
Normal que l'on puisse indiquer un indice supérieur à la taille du tableau.
Le compilateur traduit tout cela en décalage de pointeur. Depuis l'adresse de base du tableau, on décale le pointeur de indice*taille_élément et on tombe sur l'élément désiré.
C'est pour cela que le premier élément est numéroté 0, c'est pour cela que lorsque l'on réserve un tableau, on est sur que les éléments se suivent en mémoire, et c'est pour cela que les tableaux peuvent produire des 'fuites' ou des 'failles'.
Pour un tableau de 10 éléments, si je demande le n°11 (tab[10]), je tape dans la mémoire juste derrière le tableau. A moins de connaitre exactement le contenu de la mémoire et de parfaitement maitriser la manip, le résultat sera n'importe quoi, voire même autre chose.
Normal que l'on puisse indiquer un indice supérieur à la taille du tableau.
Le compilateur traduit tout cela en décalage de pointeur. Depuis l'adresse de base du tableau, on décale le pointeur de indice*taille_élément et on tombe sur l'élément désiré.
C'est pour cela que le premier élément est numéroté 0, c'est pour cela que lorsque l'on réserve un tableau, on est sur que les éléments se suivent en mémoire, et c'est pour cela que les tableaux peuvent produire des 'fuites' ou des 'failles'.
Pour un tableau de 10 éléments, si je demande le n°11 (tab[10]), je tape dans la mémoire juste derrière le tableau. A moins de connaitre exactement le contenu de la mémoire et de parfaitement maitriser la manip, le résultat sera n'importe quoi, voire même autre chose.
La gestion des exceptions try/throw/catch est un mécanisme C++.
En C (ANSI ou pas), le compilateur se plaindra de la syntaxe.
Pour les programmeurs C, consulter le fichier setjump.h.
En C (ANSI ou pas), le compilateur se plaindra de la syntaxe.
Pour les programmeurs C, consulter le fichier setjump.h.
merci pour ton aide totote mais je viens d essayer ton code mais mon compilateur n accepte pas le "IndexOutOfRangeException",justement je met "catch(...)" c est pour levee toutes les exeptions .
et quqnd je met ca et que je compile ton code pas d erruer mais a l execution le tabInt[x] = 2; ne lui pose pas de pb :( !
Je pense vraiment que c est une option de compil qui manque pour mon gcc.
et quqnd je met ca et que je compile ton code pas d erruer mais a l execution le tabInt[x] = 2; ne lui pose pas de pb :( !
Je pense vraiment que c est une option de compil qui manque pour mon gcc.
J'ai fait peut-être une erreur dans le nom de l'exception.
Tu as essayé avec x = 7, et il n'a pas affiché "x trop grand"!?
Tu as dit que tu n'arrivais pas à compilé avec "IndexOutOfRangeException", tu as mis quoi à la place ? (Exception?).
Tu as essayé avec x = 7, et il n'a pas affiché "x trop grand"!?
Tu as dit que tu n'arrivais pas à compilé avec "IndexOutOfRangeException", tu as mis quoi à la place ? (Exception?).
Je suis débutant, je suis donc pas là pour te répondre mais pour te poser une question : à quoi sert try(...)catch ?
Il faut utilisé try/catch lorsqu'il peut se produire une exception dans une portion de code et que tu veux réalisé des instructions lorsqu'une exception est levée.
Dans les parenthèses après le catch, tu doit mettre le nom de l'exception que tu veux attrapper suivi du nom de la variable qui va contenir l'exception levée(exemple : catch (Exception e)).
Puis entre les accolades au dessous du catch, tu mets le code à exécuter lorsque l'exception est levée.
Dans ton exemple, il se passe rien car aucune exception est levée!
Dans les parenthèses après le catch, tu doit mettre le nom de l'exception que tu veux attrapper suivi du nom de la variable qui va contenir l'exception levée(exemple : catch (Exception e)).
Puis entre les accolades au dessous du catch, tu mets le code à exécuter lorsque l'exception est levée.
Dans ton exemple, il se passe rien car aucune exception est levée!