Gestion des execptions et GCC

skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007 - 11 juil. 2006 à 14:04
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007 - 12 juil. 2006 à 11:17
Bonjour,

J'aurais voulu savoir si il était possible de gérer les execptions grace à l'instruction Try / Catch avec le compilateur GCC ?

Plus précisément, j'aimerai éviter les plantages sur les instructions du genre 1/0
D'après ce que j'ai compris, Try Catch fonctionne très bien par exemple sur des problèmes d'allocation mémoire, mais ne "fonctionne" plus dans le cas d'erreurs sévères comme la division par 0.

Donc, pour ceux qui connaissent Visual Basic, pour t'on avoir l'équivalent du On Error Goto ...

Merci d'avance.

8 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
11 juil. 2006 à 16:07
Il me parait nécessaire que tu apprennent deja ce qu'est une exception
et comment ca fonctione. Une exception, ca fonctionne toujours, si elle
existe.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 juil. 2006 à 16:40
SI CODE POUR WINDOWS:
l'API ne lève jamais d'exception, inutile donc d'incoporer l'énorme masse de code qu'implique la gestion d'exception, tu éviteras de ruiner les performances. N'est utile que si tu pilotes des modules COM car eux en lèvent (à destination de vb et autres interprétés).
Division par 0 et autres plaisanteries de ce genre se gèrent dans le code, on vérifie avant l'opération. Un simple 'if' est nettement moins couteux que l'empilage de tous les registres et leur dépilage ultérieur.

ciao...
BruNews, MVP VC++
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
11 juil. 2006 à 16:48
Merci luhtor d'avoir répondu.

Si je me base sur cette définition :
exception :
[programmation] Erreur dans le déroulement d'un programme, prévue lors de la conception, et gérée de main de maître (enfin, faut espérer). En fait, le programmeur est censé lui-même « lever une exception » pour détourner le déroulement normal de son programme.

Je dois en déduire qu'en fait il faut implicitement envoyer Throw pour générer une execption et donc gérér l'erreur qui aurait pu faire planter le programme.
Exemple:
int i = 0;
if (i == 0) throw("Division par Zéro");

Il n'existe donc pas d'équivalent à la commande On Error Goto label du VB.

C'est bien cela ?

Dans ce cas, quelqu'un peut-il m'expliquer pourquoi dans cette exemple l'execption est gérée toute seule sans avoir à appeler Throw ?

#include <windows.h>
#include

int main(int argc, char *argv[])
{
    int *tab1;

    try {
      tab1 = new int[700000000];
    }
    catch (...) // Now we treat gracefully the argument errors!
    {
      MessageBox(0, "Error", "", 0);;
      return(-1);
    }

    delete [] tab1;

    return(0);
}

Merci d'avance.
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
11 juil. 2006 à 17:06
Ok, je crois avoir compris.
J'ai jeter un oeil dans le livre de Richter

Dans la section C++ Exceptions Versus Structured Exceptions, j'ai trouvé ceci :

Catching Structured Exceptions with C++
Normally, C++ exception handling does not allow an application to recover from a hard exception such as an access violation or a division by 0. However, Microsoft has added this support to their compiler. For example, the following code will prevent the process from terminating abnormally:

GCC ne doit pas savoir gérer les execptions comme le compilateur de Microsoft.

Merci BruNews.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
11 juil. 2006 à 18:37
GCC sait tout a fait gérer les exceptions. Mais tu dois savoir que les
gas qui ont fait les lib du C++ ont inclu des exceptions, que tu
actives ou pas dans les paramètrages de la compilation. C'est pour ca
que ce code lève une exception sans que toi meme tu en es mis:

    try {

      tab1 = new int[700000000];

    }

    catch (...) // Now we treat gracefully the argument errors!

    {

      MessageBox(0, "Error", "", 0);;

      return(-1);

    }


Enfin je peux dire des bétises :) mais voici l'idée générale.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 juil. 2006 à 19:13
ben alors désactives les et tu pourras faire:
tab1 = new int[700000000];
if(!tab) JeSorsOuAutre();
au moins 200 cycles de gagnés.

J'adore le "gracefully"... on se moque du monde.

ciao...
BruNews, MVP VC++
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
11 juil. 2006 à 19:49
Oue mais il s'agit un tutoriel la :) l'exemple est forcément débile.
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
12 juil. 2006 à 11:17
L'exemple est d'autant plus stupide que j'ai adapté vite fait "bien fait" un exemple trouvé sur le Net (d'ou le "gracefully" tant aprécié par BruNews)

En tout cas merci pour vos réponses.
0
Rejoignez-nous