#1 Le 23/07/2013, à 10:11
- kboo
[RÉSOLU]c++: try catch.. je galère...
Bonjour,
Je galère à traiter les exceptions en c++, pouvez-vous m'aider?
Je cherche si c'est possible un moyen de traiter tout type d'exception (comme en python) et mon exemple ne marche pas:
#include <iostream>
#include <stdexcept>
int main(void)
{
std::cout << "lancement" << std::endl;
std::cout << "e" << std::endl;
try
{
char *t = 0;
t[10] = 'r';
}
catch ( const std::exception & e )
{
std::cout << "aie" << std::endl;
}
return 0;
}
merci bien !
Dernière modification par kboo (Le 24/07/2013, à 09:20)
Hors ligne
#2 Le 23/07/2013, à 10:39
- pires57
Re : [RÉSOLU]c++: try catch.. je galère...
#include <iostream>
using namespace std;
int main () {
try
{
throw 20;
}
catch (int e)
{
cout << "An exception occurred. Exception Nr. " << e << endl;
}
return 0;
}
essayes de fournir les messages d'erreur, ce sera plus simple.
En tout cas, tu peut prendre une structure de ce style.
Dernière modification par pires57 (Le 23/07/2013, à 10:41)
Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn
Hors ligne
#3 Le 23/07/2013, à 11:31
- kboo
Re : [RÉSOLU]c++: try catch.. je galère...
Merci pires57,
En fait je comprend pas trop comment utiliser 'trow' ...
Dans mon cas 'réél' j'ai un plantage sur l'appel de
heureD = A->getA()->getB()->getHeure();
et comme je ne sais pour où ça plante (certainement un des get qui renvoit un NULL) je voudrai mettre une exception mais je ne vois pas comment m'y prendre
Hors ligne
#4 Le 23/07/2013, à 11:53
- pires57
Re : [RÉSOLU]c++: try catch.. je galère...
Dans ce cas, test les fonctions a part pour voir ce qu'elle retourne si tu penses que l'une d'entre elles retourne un Null
Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn
Hors ligne
#5 Le 23/07/2013, à 12:05
- kboo
Re : [RÉSOLU]c++: try catch.. je galère...
Merci :-)
Si j'ai bien compris je doit procéder comme ça pour le premier exemple, et pour le deuxième je décompose chaque partie ?
#include <iostream>
#include <stdexcept>
int main(void)
{
std::cout << "lancement" << std::endl;
std::cout << "e" << std::endl;
try
{
char *toto = NULL;
if(toto == NULL)
throw 1;
}
catch ( int e )
{
std::cout << "aie(" << e << ")" << std::endl;
}
return 0;
}
Dernière modification par kboo (Le 23/07/2013, à 12:07)
Hors ligne
#6 Le 23/07/2013, à 14:07
- grim7reaper
Re : [RÉSOLU]c++: try catch.. je galère...
Le truc, c’est que le C++ ce n’est pas Java.
En Java, déréférencer un pointeur nul va bien lever une exception (une NullPointerException, NPE pour les intimes) que tu vas pouvoir attraper.
En C++, ça va juste faire Segmentation Fault (ou variante, selon les cas et les OS), et tu ne peux rien attraper avec le mécanisme des exception (ce n’est pas une exception).
À la limite, si tu as compilé en mode debug et que ton système l’autorise, tu vas avoir un fichier coredump que tu pourras analyser avec GDB.
> gdb toto core
GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/slaperche/toto...done.
[New LWP 7137]
warning: Can't read pathname for load map: Erreur d'entrée/sortie.
Core was generated by `./toto'.
Program terminated with signal 11, Segmentation fault.
#0 0x080486fc in main () at toto.cpp:11
11 t[10] = 'r';
(gdb)
Mais oui, tu peux aussi tester tes retours de fonctions et lever une exception si l‘un d’entre eux est nul.
Dernière modification par grim7reaper (Le 23/07/2013, à 14:09)
Hors ligne
#7 Le 24/07/2013, à 09:19
- kboo
Re : [RÉSOLU]c++: try catch.. je galère...
Merci grim7reaper !
Je comprend mieux le problème maintenant! Dans ce cas je vais continuer à travailler avec des cores comme ils le faisaient avant... car ça complique beaucoup le code et au finale lever les exceptions n'aide pas toujours à identifier l'origine du plantage!
Merci encore
PS: T'en connais un rayon c'est impressionnant !
Hors ligne
#8 Le 24/07/2013, à 12:56
- Luc Hermitte
Re : [RÉSOLU]c++: try catch.. je galère...
Les exceptions, c'est fait pour traiter les erreurs de contexte, fichier corrompu, sockets fermée, saisie utilisateur invalide, etc.
Elles sont inadaptées aux erreurs de programmation car elles perdent le contexte des erreurs. Un coredump est notre meilleur ami pour traquer les erreurs de programmation (assisté par des assert s'il le faut).
Sinon, dans ton cas, je peux aussi te recommander l'option -fsanatize de clang (gcc 4.8 l'offre aussi dans mes souvenirs) -> http://blog.llvm.org/2013/03/testing-li … tizer.html
Hors ligne