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 :

VS2008 / .net / C# : throw new Exception -> provoque une Exception


Sujet :

C#

  1. #1
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut VS2008 / .net / C# : throw new Exception -> provoque une Exception
    salut les gars,

    il m'arrive un truc bizarre et je ne sais pas comme gérer une Exception qui provoque une Exception

    dans le code suivant, throw new Exception -> provoque une Exception quand le fichier ne peut pas être converti en image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                        try
                        {
                            im = Image.FromFile(fichiersRep[i]);
                        }
                        catch (Exception)
                        {
                            throw new Exception("Erreur, le fichier : (" + fichiersRep[i] + ") n'a pas pu etre converti en image");
                            continue;
                        }
    avec le message :
    l'exception Exception ne peut pas être géré


    pour faire un test de solidité de l'appli, j'ai renommer un fichier HTML en .gif et je pensais que le try/catch allait me mettre a l'abri de toutes les surprises ... ben non.


    quelqu'un a une idée pour réellement gérer l'exception ?
    ou autre soluce ?


    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Je ne vois pas pourquoi tu utilises le continue dans cette situation. J'imagine que tu veux que l'exécution du programmes output un message d'erreur lorsqu'il y a un erreur, mais qu'il continue à rouler quand même.

    Un finally pourrait régler la situation dans ton try-catch, ce qui veut dire que peut importe si un erreur a été lancé, ton finally va s'exécuter et continuer l'exécution. Bien entendu, enlève le continue.

    Égallement, j'imagine que tu ne fais rien avec ton Exception. Oublie pas que si tu throw une exception, elle doit être reprise dans un autre bloc try-catch. Dans ce cas, je te conseil de toujours lancer des exceptions dans des If.

    Dans ton cas, test pour voir si ta variable 'im' retourne quelque chose, sinon lance une exception.

  3. #3
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut
    le continue est pour zapper cette occurence de boucle puisque l'image ne peux pas etre validé !

    voici le bloc complet :
    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
    28
    29
    30
    31
    32
    33
                    Image im;
                    for (int i = 0 ; i < fichiersRep.Length ; i++)
                    {
                        string ext = fichiersRep[i].Substring(fichiersRep[i].LastIndexOf(".") + 1).ToLower();
                        switch (ext)
                        {
                            case "bmp":
                            case "gif":
                            case "exig":
                            case "exif":
                            case "jpg":
                            case "jpeg":
                            case "png":
                            case "tif":
                            case "tiff":
                                break;
     
                            default :
                                continue;
                        }
                        try
                        {
                            im = Image.FromFile(fichiersRep[i]);
                        }
                        catch (Exception)
                        {
                            throw new Exception("Erreur, le fichier : (" + fichiersRep[i] + ") n'a pas pu etre converti en image");
                            continue;
                        }
                        imageList1.Images.Add(im);
                        listView1.Items.Add(fichiersRep[i], i);
                        im.Dispose();
                    }
    fichiersRep contient la liste des fichiers d'un répertoire et seul les images m'intéressent, ce code me permet d'éliminer tout ce qui n'est pas une image.

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Ton continue ne sert à rien actuellement. Le fait de lancer une exception va te faire sortir de ton code.

    Il faut voir le "lancer" d'exception (prochaine épreuve olympique peut être) comme une bulle de savon. Lorsque tu lances une exception celle-ci remonte jusqu'au premier bloc catch disponible. Le code après le throw ne sera donc jamais exécuté à moins d'être dans un try/catch et d'avoir un bloc finally.

    Dans ton cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try
    {
        im = Image.FromFile(fichiersRep[i]);
    }
    catch (Exception)
    {
        throw new Exception("Erreur, le fichier : (" + fichiersRep[i] + ") n'a pas pu etre converti en image");
        // On ne passera jamais ici car on lance une exception avant
        continue;
    }
    Plutôt que lancer une exception, tu devrais faire un log des problèmes.

  5. #5
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut
    ok !
    j'ai toujours du mal a comprendre le fonctionnement et l'utilisation des exceptions
    je viens de faire plusieurs tests dans un autre projet et effectivement mettre :
    throw new Exception("coucou");
    n'importe ou fait planter l'appli lors du debug par contre si je lance directement l'exe j'ai bien mon message d'erreur qui est affiché et qui me propose de continuer ou de quitter ....


    j'ai donc fait ceci pour corriger mes erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                        try
                        {
                            im = Image.FromFile(fichiersRep[i]);
                        }
                        catch (OutOfMemoryException)
                        {
                            MessageBox.Show("Erreur, le fichier : (" + fichiersRep[i] + ") n'a pas pu etre converti en image", "OutOfMemoryException");
                            continue;
                        }
                        catch (FileNotFoundException)
                        {
                            MessageBox.Show("Erreur, le fichier : (" + fichiersRep[i] + ") n'a pas pu etre trouvé", "FileNotFoundException");
                            continue;
                        }

    ----------------
    si j'ai bien compris : throw new Exception() n'est pas la pour afficher des infos a l'utilisateur mais pour envoyer des exceptions (par ex) aux utilisateurs des méthodes de nos classes qui devront les gérer dans les try/catch.

  6. #6
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par Lorenzo77 Voir le message
    si j'ai bien compris : throw new Exception() n'est pas la pour afficher des infos a l'utilisateur mais pour envoyer des exceptions (par ex) aux utilisateurs des méthodes de nos classes qui devront les gérer dans les try/catch.
    C'est tout à fait ça.

    Dans ton cas si tu veux faire de la gestion de log tu peux utiliser les méthodes abordé dans ce tuto

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/07/2007, 15h05
  2. Réponses: 1
    Dernier message: 04/04/2007, 09h12
  3. [VB.Net]Obtenir le N° de ligne d'une Exception
    Par MaelstroeM dans le forum VB.NET
    Réponses: 5
    Dernier message: 22/11/2006, 20h15
  4. Réponses: 2
    Dernier message: 19/07/2006, 10h16
  5. [C# 2.0] Un Convert.ToDouble qui semble provoque une exception.
    Par Pierre8r dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/05/2006, 16h51

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