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

Dotnet Discussion :

Exceptions en C#


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut Exceptions en C#
    Salut!
    Je débute en C#, et j'ai besoin de gérer des exceptions dans mon programme:
    Je fais quelque chose comme ça, afin de détecter les noms de "SceneNode" qui existe deja dans ma "_scene" et ainsi créer un nouveau nom lors de la création d'un nouveau SceneNode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      int i = 0;
                try
                {
                    while (true)
                    {
                        scene_.GetSceneNode(NomForme + i + "Node");
                        i++;
                    }
                }
                catch (Exception)
                {
                    nomElement_ = NomForme + i;
                }
    Bien qu'il fonctionne, est ce que ce code est correct?
    GetSceneNode renvoi une exception d'après sa documentation, mais je n'arrive pas à savoir quelle est son nom(C'est pourquoi j'ai mis "Exception" dans le "catch". Est-ce qu'il ya moyen de le trouver (par le debbuger par exemple)?
    Le gros probleme est que d'autres parties de mon code me renvoi maintenant des exceptions, alors qu'avant ils n'en renvoyaient pas... Comme si la portée du "try" s'étendait a tout mon code...

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Ben dans la doc, c'est pas écrit le nom de l'exception que cela renvoit

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut
    La doc me dit
    Note:
    Throws an exception if the named instance does not exist

    http://www.ogre3d.org/docs/api/html/...ceneManagera24
    je pense qu'il s'agit de ERR_ITEM_NOT_FOUND en regardant la liste des Codes d'Erreurs:
    http://www.ogre3d.org/docs/api/html/...edExceptionw10
    Je me demandait donc si il y avait un moyen de récuperer le nom de cette exception autrement...

    Mais en essayant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch(ERR_ITEM_NOT_FOUND)
    il me dit qu'il ne connait pas ERR_ITEM_NOT_FOUND, bien que j'ai inclus sa librairie avec un using....

    Sinon pour le code ca te parait correct?

  4. #4
    Membre émérite Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Par défaut
    Citation Envoyé par zmatz
    Salut!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      int i = 0;
                try
                {
                    while (true)
                    {
                        scene_.GetSceneNode(NomForme + i + "Node");
                        i++;
                    }
                }
                catch (Exception)
                {
                    nomElement_ = NomForme + i;
                }
    il me semble que tu es un probleme a la ligne :

    scene_.GetSceneNode(NomForme + i + "Node");

    tu melange integer et string :
    tu devrais plutot faire ca :
    scene_.GetSceneNode(NomForme + i.ToString() + "Node");

    sinon pour le catch:

    catch (Exception e)
    {
    string messageError = e.Message;// ca te donnera plus d'info.


    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut
    Merci pour ta réponse Zeavan. J'ai corrigé le int...
    pour ce qui est du message d'erreur j'obtient ça dans la variable messageError :
    "Un composant externe a levé une exception."

    Ce qui m'embête le plus c'est que je récupère des beugs sur une autre partie de mon programme, alors qu'il n'y en avait pas avant que je mette en place ce traitement d'exception....

    J'obtient un "Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."} System.Exception {System.AccessViolationException}"
    C'est un probleme de pointeur ça non?

  6. #6
    Membre émérite Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Par défaut
    lorsque tu debug , tu rentre dans le catch ???

    si oui il faut que tu t'arranges pour que ton code ne rentre pas dans le catch , une fois fait tiens nous au courant , je pense que ca resoudra pas mal de chose.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut
    Oui je rentre dans le catch...

    En fait mon algo c'est a peu près ca:
    -J'ai une liste d'element dans une scene
    -J'ai une methode qui me permet de renvoyer une exception si j'essai de récuperer un element qui n'existe pas.

    Donc pour creer une nouvel element:
    -Je fait tourner dans mon while tous les elements un par un en incrementant le suffix du nom.
    -Si en ayant incrementer je me retrouve avec l'impossibilité d'obtenir un objet=> ca me genere une exception=> Dans l'exception je crée un nouvel element avec le suffixe bien incrémenté.
    -Je sort du try et du catch (c'est cette derniere commande que je suis pas sur qui se réalise, du moins si à la vue du debbuger, mais j'ai des effets colateraux dans d'autres parties de mon code)...

    Voila est-ce que c'est correct comme algo ou bien il faut s'y prendre autrement?

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    A la premiere Exception dans le try, tu entre dans le catch. Mais ensuite ca ne se poursuit pas.
    A la limite si tu as besoin de finir quelque chose tu peux continuer avec "finally"

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par zmatz
    Voila est-ce que c'est correct comme algo ou bien il faut s'y prendre autrement?
    C'est un algo qui se base sur une exception pour sortir d'une boucle. Ce n'est jamais une bonne pratique. Les exceptions c'est pour gérer les erreurs/évènements exceptionnels, pas pour contrôler le flux du code.

    La classe que tu utilises doit bien avoir une méthode pour tester si le nom de ta node existe non ? Si oui, appelle ça avant d'y accéder. Plus besoin d'exception, tu sais quand tu as un nom inexistant, tu peux le gérer directement dans la boucle. S'il n'y a pas de méthode du genre dans cette classe, donc qu'elle est faite pour que le code client se repose sur les exceptions pour gérer son comportement... selon le cas, tu peux soit frapper le développeur qui a pondu ça, soit lui demander de rajouter une méthode pour faire ça proprement, soit chercher une autre classe mieux faite.

    Sinon de manière générale, dès qu'il y a un 'while ( true )', ça devrait activer le flag 'oula va falloir nettoyer ça' :)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  2. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35
  3. Réponses: 3
    Dernier message: 01/11/2002, 14h30
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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