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 :

Annuler une exception dans un While


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 43
    Points
    43
    Par défaut Annuler une exception dans un While
    Bonjour,

    Je cherche un moyen "propre" pour annuler une exception dans un While et continuer le traitement.

    Mon code ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    While ()
    {
    ... Mes instructions
    }
    catch (...)
    {
     ... Inscrit exception dans une log
     ==> 'Reprend le traitement While à l''occurence suivante'
    }
    Le catch est indispensable pour remonter l'erreur et l'inscrire dans une log, mais je souhaite continuer le traitement. En effet je boucle sur plusieurs centaines de milliers d'enregistrements dans mon While et il ne doit pas s'arrêter si un pb survient sur 1 seul enreg en plein milieu par exemple. Néanmoins l'info du plantage doit être tracé pour pouvoir relancer le traitement uniquement sur l'enreg qui a posé pb.

    Une idée ?

    Merci d'avance,

  2. #2
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    mets le try/catch dans le while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while (condition)
    {
        try
        {
            // ... Mes instructions
        }
        catch(...)
        {
            // ... Inscrit exception dans une log
            // ==> 'Reprend le traitement While à l''occurence suivante'
        }
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 312
    Points : 411
    Points
    411
    Par défaut
    Enfin si tu 'catch' a tous les coups et que tu continue, ton exception est inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    While(condition)
    {
      if(doJob() == ERROR)
      {
         log();
      }
    }
    Après il est possible que tu passe par une library externe qui envoie une exception, mais sauf contrainte forte de ce genre, il vaut mieux éviter les levées d'exceptions inutiles.

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 148
    Points : 291
    Points
    291
    Par défaut
    tomlev => Le programme va quand même s’arrêter dans le catch je me trompe ?

    EDIT : Merci de la précision Nathanael

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Si tu ne fais pas de throw dans le catch non il continuera la boucle

  6. #6
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    ok merci à vous, je vais effectivement tenter de mettre le try/catch dans le while... J'avais pas pensé à cela effectivement.

    Je relance et je vois

    Merci !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 312
    Points : 411
    Points
    411
    Par défaut
    Oui mais ce n'est pas la solution 'propre' comme tu le demandais en début de post.

  8. #8
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par nah666 Voir le message
    Oui mais ce n'est pas la solution 'propre' comme tu le demandais en début de post.
    Euh... et pour toi la solution propre c'est d'utiliser un code de retour plutôt que d'intercepter l'exception ?
    Dans ce cas autant programmer en C

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 312
    Points : 411
    Points
    411
    Par défaut
    @Tomlev

    Je peux me planter, mais il me semble avoir compris qu'on est dans un flot d’exécution normal, qu'il peut y avoir des erreurs dans les données traitées dans la boucle.

    A priori on veut pouvoir (via log) retrouver cet enregistrement pour plus tard.

    Rien pour moi "d'exceptionnel" dans le sens imprévisible d'un point de vue développement.

    Les exceptions ne doivent pas être utilisées pour gérer la logique applicative, mais justement pour les cas qui ne sont pas maîtrisés par l'application.
    Du coté performance, on sait aussi que les exceptions coutent cher.

    http://stackoverflow.com/questions/4...void-exception

    Euh... et pour toi la solution propre c'est d'utiliser un code de retour plutôt que d'intercepter l'exception ?
    Oui :

    Je prefere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    If(doJob())
    {
      return theReturn;
    }
    else
    {
      log(getErrorString());
      return getEmptyResult();
    }
    a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try
    {
       doJob();
    }
    catch
    {
       log(getErrorString());
       return getEmptyResult();
    }
      return theReturn;

  10. #10
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Ca dépend des cas en fait... D'une manière générale, je suis d'accord qu'il vaut mieux éviter de lever des exceptions si on peut faire autrement, notamment dans du code où les performances sont critiques. Mais dans un processus métier complexe, c'est souvent le moyen le plus pratique pour faire remonter une erreur à un niveau supérieur, et c'est beaucoup plus propre et mieux structuré que d'utiliser un code de retour.

    En plus, dans l'exemple que tu donnes, c'est quoi cette méthode getErrorString ? Elle n'a aucun lien direct avec l'opération qui a déclenché l'erreur, comment fais-tu pour être sûr que les données qu'elle renvoie sont bien liées à l'opération qui a échoué ? Avec les exceptions, ces questions ne se posent pas.

    Mais évidemment, il faut pas en abuser... Par exemple tu vas pas t'amuser à catcher des NullReferenceException : il vaut mieux vérifier manuellement si la variable est null (exemple un peu caricatural, certes).

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 312
    Points : 411
    Points
    411
    Par défaut
    c'est souvent le moyen le plus pratique pour faire remonter une erreur à un niveau supérieur
    Oui pour le niveau supérieur (dans ce cas nous somme dans le même niveau applicatif et même dans la même méthode).

    c'est souvent le moyen le plus pratique pour faire remonter une erreur à un niveau supérieur, et c'est beaucoup plus propre et mieux structuré que d'utiliser un code de retour.
    Une fois de plus, si c'est le flot normal de ta logique applicative il est (fortement) recommandé d'éviter l'utilisation d'exceptions, je sais néanmoins que beaucoup de dev préfèrent utiliser les exceptions car plus 'pratique', ce qui ne veut pas forcement dire propre .

    Mais évidemment, il faut pas en abuser...
    Oui je pense que la règle absolue reste toujours le bon sens
    C'est aussi ce que j'aime dans ce métier c'est que chacun a une approche différente et il y a souvent plusieurs bonnes solutions

  12. #12
    Membre actif Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Points : 293
    Points
    293
    Par défaut
    Citation Envoyé par nah666 Voir le message
    Une fois de plus, si c'est le flot normal de ta logique applicative il est (fortement) recommandé d'éviter l'utilisation d'exceptions
    Ça implique que le type de tes erreurs correspond au type de retour "normal" de ta méthode.
    Tu te retrouves souvent avec le problème de la méthode atoi du C.
    Elle renvoie 0 en cas d'erreur, et un entier sinon.
    Comment déterminer qu'une erreur est apparue ? (rappel : 0 est un entier ^^)

    Les exceptions pallient se problème ...

  13. #13
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par brachior Voir le message
    Ça implique que le type de tes erreurs correspond au type de retour "normal" de ta méthode.
    Tu te retrouves souvent avec le problème de la méthode atoi du C.
    Elle renvoie 0 en cas d'erreur, et un entier sinon.
    Comment déterminer qu'une erreur est apparue ? (rappel : 0 est un entier ^^)

    Les exceptions pallient se problème ...
    Tu n'as pas forcément besoin des exceptions pour faire ça.
    Tu peux envisager d'avoir des arguments en ref ou en out (comme pour les TryParse).

  14. #14
    Membre actif Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Points : 293
    Points
    293
    Par défaut
    Citation Envoyé par meziantou Voir le message
    Tu n'as pas forcément besoin des exceptions pour faire ça.
    Tu peux envisager d'avoir des arguments en ref ou en out (comme pour les TryParse).
    Je dis pas, c'est ce que fait la méthode strtol en C qui est sensée être utilisée à la place de atoi ^^
    Mais bon ^^ Je trouve que ça rend la chose plus compliquée à gérer ...
    Et pas forcement approprié à la lecture du code et sa compréhension ...
    switch ou imbrication de if ... else ...
    Mais c'est mon point de vue ^^

  15. #15
    Membre éprouvé 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
    Points : 1 108
    Points
    1 108
    Par défaut
    J'arrive un peu tard sur ce sujet, mais je ne suis pas d'accord avec l'emploi du code de retour.
    Si tu as une méthode qui retourne une List<zozo>, comment tu fais avec ton code de retour ?
    Tu passes l'un ou l'autre en paramètre out ? Ou tu utilises le type de retour "tuple" du 4.0 ? Ou tu fais - comme j'ai été obligé de le faire sur un de mes projets - une classe de retour contenant des erreurs, et des types de retour via héritage ?

    S'il y a une exception, c'est qu'un truc ne va pas. Il faut la gérer ad hoc ou la propager... c'est le but de l'exception en POO.
    Maintenant, les exceptions (catch) étant un peu coûteux en perf, il faut les utiliser à bon escient (euh j'ai un doute sur l'orthographe là !).

    J'ai eu, dans ce même projet, l'occasion de faire un foreach (ce qui fini en while un fois compilé ) qui récupérait des tas de retours de méthodes avec des exceptions... qui au final servaient à construire des logs et impliquait des traitements particuliers pour pallier au problème rencontré...
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/01/2009, 10h49
  2. Réponses: 3
    Dernier message: 29/05/2006, 23h46
  3. Annuler une insertion dans un Trigger
    Par dreamanoir dans le forum Oracle
    Réponses: 2
    Dernier message: 10/01/2005, 13h04
  4. 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