Rechercher : dans
Par :

Utilisation de try catch en C ou C++

Dernière réponse le 15 avr 2007 à 11:48:04 d-bax, le 3 aoû 2004 à 18:33:45 
 Signaler ce message aux modérateurs

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");
}

Meilleures réponses pour « Utilisation de try catch en C ou C++ » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Mettre un titre en couleur dans un skyblog VoirPour mettre un titre en couleur dans votre SkyBlog, il suffit d'utiliser la balise [c], de la manière suivante : [c=#AEBFE2][g]Titre en couleur[/g][/c]
Java - Les exceptions VoirLa nécessité de détecter les erreurs Tout programme comporte des erreurs, même si celui-ci semble fonctionner à merveille. Chaque programmeur essaye de réduire au minimum le nombre d'erreurs, mais toutes les erreurs ne peuvent pas forcément être...

1

Onde2Choc, le 3 aoû 2004 à 19:32:33

Je suis débutant, je suis donc pas là pour te répondre mais pour te poser une question : à quoi sert try(...)catch ?

Répondre à Onde2Choc

2

totote, le 4 aoû 2004 à 08:43:19

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!

Répondre à totote

3

totote, le 4 aoû 2004 à 08:55:47

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.

Répondre à totote

4

Onde2Choc, le 4 aoû 2004 à 09:03:08

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) ?

Répondre à Onde2Choc

5

d-bax, le 4 aoû 2004 à 09:49:20

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.

Répondre à d-bax

6

totote, le 4 aoû 2004 à 12:30:13

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?).

Répondre à totote

7

totote, le 4 aoû 2004 à 13:42:06
  • +1

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.

Répondre à totote

8

Jolkdarr, le 5 aoû 2004 à 14:34:48
  • +1

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 ?

Répondre à Jolkdarr

9

fl0ra@hotmail.com, le 5 aoû 2004 à 14:58:33

Mais...
try et catch c'est pas vraiment tres C ANSI tout ca... non? :D

Répondre à fl0ra@hotmail.com

10

Jolkdarr, le 5 aoû 2004 à 15:06:33

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.

Répondre à Jolkdarr

11

Jolkdarr, le 5 aoû 2004 à 15:14:29

Setjmp.h

(pardon)

Répondre à Jolkdarr

12

d-bax, le 9 aoû 2004 à 13:16:58

Merci tout le monde je vais essayer de me debrouiller avec ca.
Merci encore

Répondre à d-bax

13

Char Snipeur, le 3 avr 2006 à 22:46:58

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 !! Salutation !
Char Snipeur

Répondre à Char Snipeur

14

 lolo, le 15 avr 2007 à 11:48:04

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.

Répondre à lolo
Collection CommentÇaMarche.net