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 :

L'exception FileNotFoundException n'est pas gérée par le code utilisateur


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut L'exception FileNotFoundException n'est pas gérée par le code utilisateur
    Bonjour tout le monde,
    alors voila mon problème :

    Je dois récupérer un fichier XML à partir d'un chemin (facile) et ça marche très bien lorsque le fichier existe.

    En revanche, s'il n'existe pas, au lieu de me renvoyer l'exception FileNotFoundException comme je lui dis de faire, il me met une erreur au niveau du catch(Exception ex) en me disant que l'exception FileNotFoundException n'a pas été gérée par l'utilisateur.

    Pourtant avec le debug pas à pas je vois qu'il passe dans le else ainsi que dans le catch(FileNotFoundException)...

    J'ai essayer de trouver une solution mais rien de concluant... ça commence à me rendre un peu fou alors je vous demande votre aide^^

    Merci bcp!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    try
    {
         if (File.Exists(str_Path))
         {
               // On charge le fichier Xml à partir du chemin préalablement construit
               reader = new StreamReader(str_Path, Encoding.GetEncoding("iso-8859-1"));
               xmldoc_Document.Load(reader);
         }
         else throw new FileNotFoundException("Impossible de récupérer le fichier Xml voulu : " + str_Path);
    }
    catch (FileNotFoundException fileNotFoundExc)
    {
         throw new FileNotFoundException(fileNotFoundExc.Message);
    }
    catch (Exception ex)
    {
         throw new TranslationException("Impossible de récupérer le fichier Xml voulu. \nDétails : " + ex.Message);
    }
    finally
    {
         if (reader != null)
         {
               reader.Close();
               reader.Dispose();
         }
    }

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Salut ,

    je pense que le problème vient d'ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    catch (FileNotFoundException fileNotFoundExc)
    {
         throw new FileNotFoundException(fileNotFoundExc.Message);
    }
    Ton catch capture l'exception généré précédemment, jusque là tout est OK, par contre la ligne dans ton catch renvoi une exception à la méthode qui appelle cette fonction, si l'exception de type FileNotFoundException n'est pas gérée dans la méthode qui appelle alors il t'affiche le message ...

    Que souhaite tu faire une fois que tu as capturé cette erreur ? afficher un message, il faut dans ce cas que tu ajoute le même un autre try catch dans la méthode appelante.

    @+

  3. #3
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Ceci serait sans doute préférable pour ne pas perturber la pile des exceptions :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    catch (FileNotFoundException)
    {
         throw;
    }
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    Bonjour,
    un petit conseil pour les exceptions : ne les capture que quand tu sais les traiter.

    (les traiter est souvent dans une application les logger et afficher à l'utilisateur un message pour lui indiquer que son opération n'a pas fonctionnée)

    Ton code va devenir vachement plus clair, lisible et maintenable, tu ne te torturera plus non plus à mettre des exceptions "métier" partout, mais seulement lorsque les conditions du métier ne seront pas réunies :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    try
    {
         // On charge le fichier Xml à partir du chemin préalablement construit
         reader = new StreamReader(str_Path, Encoding.GetEncoding("iso-8859-1"));
         xmldoc_Document.Load(reader);
    }
    finally
    {
         if (reader != null)
         {
               reader.Close();
               reader.Dispose();
         }
    }

    autre petit détail, utilise plutot le "e.ToString()" que le "e.Message", avec "e.Message", tu n'a que le message alors que le "e.ToString()" t'affiche aussi la pile des appels.

    Bon courage pour la suite

  5. #5
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    Citation Envoyé par Vimaire Voir le message
    utilise plutot le "e.ToString()" que le "e.Message", avec "e.Message", tu n'a que le message alors que le "e.ToString()" t'affiche aussi la pile des appels.
    C'est faux, il vaut mieux utiliser e.Message et/ou e.StackTrace. e.ToString() ne te garantit pas la pérennité du format. Si tu catch une exception créée par quelqu'un qui a overridé la fonction ToString, tu peux pas garantir qu'il t'affichera la pile des appels. mieux vaut utiliser explicitement e.Message et e.StackTrace. C'est pas le sujet

    Pour en revenir au sujet :

    si c'est une fonction, tu peux renvoyer un booléen pour savoir si ça s'est bien passé avec un message en paramètre out.
    Tu peux aussi afficher un message à l'utilisateur. etc...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public bool MaFonction(string str_Path, out string Message)
    {
    try
    {
         if (File.Exists(str_Path))
         {
               // On charge le fichier Xml à partir du chemin préalablement construit
               using(StreamReader reader = new StreamReader(str_Path, Encoding.GetEncoding("iso-8859-1")))
     
               xmldoc_Document.Load(reader);
         }
         else 
        {
            Message = "Impossible de récupérer le fichier Xml voulu : " + str_Path;
            return false;
        }
    }
    catch (Exception ex)
    {
         Message = "Impossible de récupérer le fichier Xml voulu. \nDétails : " + ex.Message;
        return false;
    }
    Message = string.Empty;
    return true;
    ça pourrait donner quelquechose du genre, mais n'ayant pas VS sous la main je te tape ça à la volée.

    Bon dév.
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/07/2014, 09h42
  2. le caractère '_' n'est pas reconnu par le langage SQL
    Par zainab2000 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/03/2007, 20h42
  3. [MySQL] MySQL n'est pas chargé par php
    Par elvan49 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/11/2006, 16h14
  4. Réponses: 1
    Dernier message: 17/10/2006, 15h05
  5. innerText n'est pas reconnue par FireFox !
    Par faico dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/08/2006, 21h51

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