IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Migration vs2003 -> vs2005: Catch exceptions


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Migration vs2003 -> vs2005: Catch exceptions
    Salut,

    J'ai migre une application de Visual Studio 2003 vers Visual Studio 2005.
    Je suis confronte a un probleme avec le catch d'exceptions.

    Le programme catche bien toutes les exceptions / crash sous VS2003, par contre sous 2005 toutes les exceptions ne sont pas catchees.

    exemple de code qui catch le crash en 2003 et pas en 2005 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void myfunc2()
    {
    	try
    	{
    		vector<string> a = Split("rrrr", "a", false);
    		a[20] = 's';
    	}
    	catch (...)
    	{
    		printf("CRASH!!\n");
    	}
    }
    J'ai fait le tour des proprietes du vcproj mais sans succes. (CLR, SEH...)

    Pouvez vous m'aidez ?
    Je dois a tout prix etre en mesure de catcher tout type de crash possible puisque mon programme utilise des DLL fournies par des utilisateurs, donc on ne peut pas les considerees fiables a 100% et ca ne doit pas mettre en peril l'application.

    Merci d'avance !

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Ton exemple met en péril la pile. Si elle est corrompue le catch ne fonctionnera pas. Si ça fonctionne en vs2003, je pense que c'est un coup de bol.

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par camboui Voir le message
    Ton exemple met en péril la pile. Si elle est corrompue le catch ne fonctionnera pas. Si ça fonctionne en vs2003, je pense que c'est un coup de bol.
    Peux tu expliquer plus en details ?


    En tout cas il semble que visual 2005 ne gere pas du tout de la meme facon les exceptions et j'ai du mal a arriver a tout catcher (je suis bien conscient que dans certains cas ca peu corrompre la memoire et mettre en peril tout le contexte d'execution).

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Remplace ta ligne
    a[20] = 's';
    par
    a.at(20) = 's';
    pour voir...

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui en effet utiliser .at() fonctionne, l'erreur est catchee.

    Sauf que dans mon cas je ne sais pas comment vont coder mes utilisateurs et je souhaite dans 99% des cas etre en mesure de catcher l'erreur.

    Quelle difference y a-t-il entre VS2003 et VS2005 pour que l'un le gere tres bien et pas l'autre ?
    N'y a-t-il pas moyen de configurer mon projet pour que ca foncitonne de la meme facon ?

  6. #6
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    L'opérateur [] du vector n'est pas sensé tester la validité de l'index, mais "at" si.
    Cela dit, souvent l'opérateur test quand même la validé de l'index en mode debug.
    Donc les explications que je vois sont:
    - Ton projet VS2003 est en debug mais pas ton projet VS2005(sans oublier le #define _DEBUG et NDEBUG qu'utilise peut-etre ta STL). Dans ce cas il suffit de bien configurer ton projet.
    - VS2003 test en debug, et pas VS2005. Dans ce cas(mais je serais surpris), il doit être possible de modifier un tout petit peut ta STL, et de rajouter ce test en mode debug.(J'ai eu exactement ce problème sous borland).

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Debug ou release ca fait la meme chose

    Ce ne serait pas une histoire CLR / SEH qui ne fonctionnerait pas de la meme facon sous 2003 et 2005 ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    Avez-vous les même options entre VS2003 et VS2005, en particulier la gestion asynchrone des exceptions ?

    Je ne m'étalerais pas sur le fait qu'un "catch ..." est tout sauf une bonne idée.

    Utilisez une architecture de plug-Ins, avec des contextes mémoire et de pile les plus cloisonnés possible grâce, entre autre, aux threads.

  9. #9
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui les options sont les memes entre 2003 et 2005.

    Pour ce qui est de la gestion multi modules elle est faites par thread. Mais a ma connaissance les thread etant crees au sein du meme processus, la memoire est partagee pour tous les thread.

    Un thread qui va faire un access violation fait planter l'application complete et pas uniquement son thread.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Par défaut, à partir de Visual 2005, un catch(...) attrape les exceptions C++, mais pas les exceptions SEH ordinaires (sans doute pour des raisons de conformité au standard C++).
    Mais ça peut se changer.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Par défaut, à partir de Visual 2005, un catch(...) attrape les exceptions C++, mais pas les exceptions SEH ordinaires (sans doute pour des raisons de conformité au standard C++).
    Mais ça peut se changer.
    Oui je suis deja en /EHa

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je rajoute que catcher une access violation dans le même process n'est généralement pas une bonne idée, car ça montre que tu as déjà de la mémoire corrompue quelque part.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    Si vous n'avez pas confiance dans le code des Plug-Ins et être blindé contre des accès violations (je trouve cela un peu excessif, surtout si votre application se ferme en bonne ordre avec des finally).
    Plusieurs solutions :
    En .NET, faire des Plug-Ins des assembly "safe" chargé dans des AppDomains indépendant de celui de l'application.
    En COM, faire des Plug-Ins soit des composant out-of-process, soit des composant chargé via du surugate.
    Plus old school, en utilisant des processes indépendant en client/serveur par exemple avec un médian de communication quelconque.

    Mais aucune n'utilise un catch(...) complètement dérisoire face à une dll pouvant tous faire. C'est comme brandir une feuille de papier face un à missile balistique multi-ogive de plusieurs centaines de mégatonnes chacune

Discussions similaires

  1. [VB.NET] Migration VS2003 vers VS2005 & Framework 2.0
    Par ag007 dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 03/09/2007, 14h46
  2. Problème de migration vs2003 vs2005
    Par shenron666 dans le forum VC++ .NET
    Réponses: 9
    Dernier message: 13/07/2007, 23h13
  3. probleme try catch, Exception
    Par Slumpy dans le forum VB.NET
    Réponses: 9
    Dernier message: 23/03/2007, 15h51
  4. VS2003 et VS2005
    Par Invité dans le forum Visual Studio
    Réponses: 2
    Dernier message: 30/10/2006, 17h23
  5. [VS2003][C#][liste des exceptions]
    Par lafleurlafleur dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/11/2005, 11h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo