Téléchargement
illégal
Posez votre question Signaler

Utilisation de try catch en C ou C++

d-bax - Dernière réponse le 15 avril 2007 à 11:48
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");
}
Lire la suite 

Utilisation de try catch en C ou C++ »

14 réponses
Réponse
+2
moins plus
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.
Ajouter un commentaire
Réponse
+1
moins plus
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 ?
Ajouter un commentaire
Réponse
+0
moins plus
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) ?
Ajouter un commentaire
Réponse
+0
moins plus
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 !!
lolo - 15 avril 2007 à 11:48
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.
Ajouter un commentaire
Réponse
-1
moins plus
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.
Ajouter un commentaire
Réponse
-1
moins plus
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.
Ajouter un commentaire
Réponse
-1
moins plus
setjmp.h

(pardon)
Ajouter un commentaire
Réponse
-1
moins plus
Merci tout le monde je vais essayer de me debrouiller avec ca.
Merci encore
Ajouter un commentaire
Réponse
-2
moins plus
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.
Ajouter un commentaire
Réponse
-2
moins plus
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?).
Ajouter un commentaire
Réponse
-2
moins plus
mais...
try et catch c'est pas vraiment tres C ANSI tout ca... non? :D
Ajouter un commentaire
Réponse
-4
moins plus
Je suis débutant, je suis donc pas là pour te répondre mais pour te poser une question : à quoi sert try(...)catch ?
Ajouter un commentaire
Réponse
-4
moins plus
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!
Ajouter un commentaire
Ce document intitulé « Utilisation de try catch en C ou C++ » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?