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 :

Comment identifier une exception? Peut on obtenir un numéro?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut Comment identifier une exception? Peut on obtenir un numéro?
    Bonjour à tous,

    Je me pose une question concernant les exceptions. Est il possible d'identifier uen exception?
    Prenons un exemple. J'utilise la fonction File.Copy(), celle ci peut lever un certain nombre d'exceptions, comme System.IO.IOException par exemple.
    Hors, si le disque est plein (quota exceeded) ou si le fichier existe déjà, j'ai le même type d'exception "System.IO.IOException". Peut on les différencier autrement que part le message car je ne trouve pas ça très fiable...
    Je ne sais pas, soit en récupération le code (mais apparament ça n'existe pas), soit autrement.
    Quelqu'un aurait il une piste svp?

    Merci d'avance

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    par le message c'est en effet pas terrible, il peut changer selon la langue de l'os ...

    tu peux regarder dans ex.data s'il y a quelque chose ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Chaque classe/méthode est documentée dans msdn. Tu as donc la liste des exceptions disponibles dans chaque cas...
    Peut-être qu'avec les inner-exceptions tu pourrais avoir d'autres infos, mais tu vas devoir coder un truc pour gérer ça... avec le Catch, tu n'as pas le choix. Mais je dis ça sans être convaincu moi-même.
    Si le cas que tu as cité est ton cas réel, alors fait un File.Exists et tu élimineras cette erreur...

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par takinelinfo Voir le message
    Bonjour à tous,

    Je me pose une question concernant les exceptions. Est il possible d'identifier uen exception?
    Prenons un exemple. J'utilise la fonction File.Copy(), celle ci peut lever un certain nombre d'exceptions, comme System.IO.IOException par exemple.
    Hors, si le disque est plein (quota exceeded) ou si le fichier existe déjà, j'ai le même type d'exception "System.IO.IOException". Peut on les différencier autrement que part le message car je ne trouve pas ça très fiable...
    Je ne sais pas, soit en récupération le code (mais apparament ça n'existe pas), soit autrement.
    Quelqu'un aurait il une piste svp?

    Merci d'avance
    Tu es sur qu'il n'y a pas d'InnerException associée ?

  5. #5
    Membre Expert 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
    Par défaut
    Et si tu fais
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    GetBaseException().GetType()
    sur ton exception, tu obtiens une différence selon les cas ?

    Si oui c'est qu'à un moment donné les exceptions sont encapsulées alors qu'elle ne le devrait pas.

    Il est possible que tu ne puisses pas le faire à cet endroit là, mais que tu sois obligé de gérer ton propre type d'exception par rapport à ta connaissance de l'erreur. (Pour peu que ça soit à deux endroits différent dans ta méthode, sinon là je sèche, sauf à trier par message)

  6. #6
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Une chose non garantie du tout (et je tiens à le préciser), serait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int error = Marshal.GetLastWin32Error();
    mais ce bout de code n'est pas garanti du tout dans la mesure ou une autre erreur Win32 peut apparaître entre temps et qu'il faut que ce soit de l'Interop qui effectue la copie de fichier (et que la récupération des erreurs soit activée).

    Bref, beaucoup de si, donc la question est : pourquoi vouloir distinguer les cas ?
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Ajoute un test File.Exists(...), si ça pète, tu sauras pourquoi. Les exceptions c'est beau, mais ça n'empêche pas de faire des checks préliminaires !

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    j'ai déjà entendu "si bouygues faisait des maison comme un développeur fait un logiciel, les maisons s'écouleraient très vite, il y aura des portes au plafond etc..."

    et en effet si on transpose ce qu'on fait tous dans d'autres métiers ça peut faire peur
    genre le pilote d'avion qui soit vérifie qu'il a le plein avant de décoller, et que les ailes sont là ou alors une fois l'avion crashé il cherche pourquoi il est tombé
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Pour répondre a la question initiale, si tu veux des messages plus explicites, il va falloir passer par l'API windows, a coup de DllImport, de maniere a avoir les primitives pour lire/écrire dans des fichiers, et les primitves pour les messages d'erreurs, notament GetLastError()

    D'ailleur il est peut etre possible de n'utiliser que GetLastError, mais je ne le garantit pas.

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par cs_ntd Voir le message
    D'ailleur il est peut etre possible de n'utiliser que GetLastError, mais je ne le garantit pas.
    Le retour de GetLastError peut être intégré nativement aux appels P/Invoke.

    C'est une fonctionnalité de base; elle est décrite dans l'attribut DllImport.

  11. #11
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Ce que je voulais dire, c'est que je ne suis pas sur que n'utiliser QUE GetLastError soit significatif...

    Dans ma tête, je me disais que comme on est en .NET, la "LastError" ne sera peut-être pas celle que l'on cherche, et de plus, (je m'en souvient maintenant), il faut utiliser FormatMessage, pour avoir l'erreur sous une forme lisible.

    De plus, ce n'est qu'une théorie, je ne garantit pas que le message qu'on obtiendra soit plus significatif que le message de l'exception .NET.

    Sinon, le retour de GetLastError est un DWORD, donc utilisable oui, mais je ne comprend pas ce que tu veux dire par
    C'est une fonctionnalité de base; elle est décrite dans l'attribut DllImport.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    IOException hérite de SystemException, qui a une propriété HResult. Cette propriété est protected (je sais pas trop pourquoi d'ailleurs), mais on peut y accéder avec la méthode Marshal.GetHRForException. Ensuite il suffit de tester la valeur du HRESULT...

    Je n'ai pas trouvé de "table de référence" des codes HRESULT, mais il suffit de tester un cas d'erreur contrôlé pour obtenir la valeur correspondante. Sinon il y a cette page qui décrit la structure d'un HRESULT...

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par tomlev Voir le message
    IOException hérite de SystemException, qui a une propriété HResult. Cette propriété est protected (je sais pas trop pourquoi d'ailleurs), .
    Pas illogique dans la mesure ou IOException même si elle est instanciable est plutôt destinée à être héritée (File*, Directory*, etc ...)

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut
    Citation Envoyé par tomlev Voir le message
    IOException hérite de SystemException, qui a une propriété HResult. Cette propriété est protected (je sais pas trop pourquoi d'ailleurs), mais on peut y accéder avec la méthode Marshal.GetHRForException. Ensuite il suffit de tester la valeur du HRESULT...

    Je n'ai pas trouvé de "table de référence" des codes HRESULT, mais il suffit de tester un cas d'erreur contrôlé pour obtenir la valeur correspondante. Sinon il y a cette page qui décrit la structure d'un HRESULT...
    C'est exactement ce que je cherchais.
    Obtenir un code, un identifiant unique par exception.
    Il ne reste plus qu'à fabriquer une table de correspondance pour les codes.
    Un grand merci.

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 02/10/2006, 17h19
  2. Comment identifier une machine de facon unique ?
    Par BigBenQ dans le forum Développement
    Réponses: 14
    Dernier message: 19/12/2005, 08h36
  3. comment identifier une transaction http?
    Par didier.cabale dans le forum Développement
    Réponses: 5
    Dernier message: 13/04/2005, 16h42
  4. [SqlException] comment identifier l'exception
    Par Jchasson dans le forum JDBC
    Réponses: 3
    Dernier message: 08/10/2004, 11h38
  5. Réponses: 2
    Dernier message: 28/08/2003, 00h00

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