none
try catch RRS feed

  • Discussion générale

  • bonjor à tous

    j'aurais besoin d'un complement d'inofrmation sur le fonctionnment du bloc try catch.

    mon pb est le suivant :

    j'ai une appli qui parcourre  les mails d'une boite de reception. J'utilise le bloc try catch pour intercepter les erreurs. quand le mail est correct (selon certains criteres du traitement proprement dit) soit je deplace le mail dans un repertoire "mails traites" soit je le deplace dans un autre repertoire "mails_rejete".

    si aucune erreur n'est detectée tout se passe bien (je serais tente de dire "logique ;-))

    mais si une erreur interveint , le catch est donc utilisé (je traite l'erreru en l'inscrivant dans un fichier log et ensuite  le mail est déplacé dans le repertoire "mails_rejetes", mais le pb, c'est que le traitment ne continue pas (je suis dans une boucle forEach)

    Conséquence : si j'ai 20 mails et que le second est en erreur, les 18 suivants ne sont pas traites. Est ce que le fait de passer dans un catch, arrete carrement le traitement ou y a t il moyen de faire continuer celui ci , meme apres une erreur detectée ?

    Merci à vous pour votre aide.

    Cordialement

    AL

     

    jeudi 20 mai 2010 09:21

Toutes les réponses

  • Bonjour,

    au vu du problème que vous décrivez, je suppose que votre boucle foreach se trouve à l'intérieur de votre bloc try, c'est pour cela que le traitement s'interrompt lorsqu'une exception est levée pour être traitée dans le bloc catch. Pour que votre foreach continue, il faudrait mettre votre try catch à l'intérieur de votre foreach, comme cela le traitement se fera pour l'élément courant et pourra passer au suivant.

    En espérant avoir pu vous aider.


    Audrey - http://blogs.developpeur.org/audrey/
    jeudi 20 mai 2010 09:43
  • Bonjour Audrey et Merci pour votre aide

    et bien non justement, j'y avais pensé mais je suis bien dans la situation "try dans le foreach", c'est bien ce qui m'ennuie ;-((

    C'est pour cela que j'avais pensé que le catch arretait purement et simplement le traitement ..

     

    jeudi 20 mai 2010 09:51
  • ah zut j'ai été trop vite ... désolé

    ceci dit je  viens de me rendre compte que dans le try en question, j'ai deux autres try catch imbriqués ... mais tjrs dans le for each ... ceal peut il influencer le traitement (en theorie , je dois revenir apres les catch .. donc toujours dans le bloc for each non ?

     

    jeudi 20 mai 2010 09:55
  • serait-il possible de nous copier/coller le foreach avec son contenu pour qu'on puisse bien comprendre d'où vient le problème ?

    Audrey - http://blogs.developpeur.org/audrey/
    jeudi 20 mai 2010 10:09
  • oui bien sur le voila (un peu long ... j'ai retiré qq lignes concernant le traitemetn du body  .. rien d'influent je pense sur le pb

     foreach (var lemail in findResults)
                {
                  Console.WriteLine("mail traité : "+ lemail.Subject.ToString());
                  try
                  {
                    // on filtre le corps du mail avec une expression regulière définie par la fonction SMS
                    // (bas de page), pour ne recuperer que le texte (elimination du code html)
    
                    // bodyTemp : save du body avant traitement pour avoir un fichier lisible
                    // lors de la phase d'archivage
                    bodyTemp = SMS(lemail.Body.Text.ToString());
                    //elimine les blancs générés automatiquement
                    bodyTemp = bodyTemp.Replace(" ", "");
                    body = SMS(lemail.Body.Text.ToString());
                    //elimine les blancs générés automatiquement
                    body = body.Replace(" ", "");
                    //remplace les blancs par 3 "@" pour mieux determiner les ruptures de lignes et
                    //retour chariots
                    body = body.Replace("\r\n", "@@@");
    
                    Console.WriteLine(lemail.Subject.ToString());
                    //Console.WriteLine(body.ToString());
    
                    // traitement à part de la date
                    posDeb = body.IndexOf("Demande effectuée le ") + 21;
                    lechamp = body.Substring(posDeb, 10);
                    lechamp = lechamp.Trim();
                    ladateCre = lechamp;
    
                    // inversion champs date
                    var an = ladateCre.Substring(2, 2);
                    var jj = ladateCre.Substring(8, 2);
                    var mm = ladateCre.Substring(5, 2);
                    ladateCre = jj + "/" + mm + "/" + an;
                    //Console.WriteLine("ladate : " + ladateCre.ToString());
                   
                  
    
    // ***-7-*** INSERT DANS TABLE PROSPECT
    ****************
                    leSiteProv = varsite;
                    if (leSiteProv != null)
                    {
                      PROSPECT param = new PROSPECT
                      {
                        SITE = leSiteProv,
                        EXPEDITEUR = arch_exped,
                        DESTINATAIRE = arch_desti,
                        ARCHIVE = cheminArchivage + marque + @"\"
                      };
    
                      try
                      {
                        ledatac.PROSPECT.InsertOnSubmit(param);
                        ledatac.SubmitChanges();
                      }
                      // LOG                
                      catch (Exception e)
                      {
                        strLog = "2nd ACCES BASE DE DONNES - table PROSPECT ==> ECHEC " + "\n";
                        log2 errLog = new log2();
                        errLog.ErrorLog(e, cheminArchivage, strLog, logTime);
                        ctrLog = ctrLog + 1;
                      }
    
                    }
    
    
    // ***-8-*** INSERTION DANS LA TABLE PROSPECT_AJOUT ****************
    
                    PROSPECT_AJOUT pro = new PROSPECT_AJOUT
                    {
                      //PK_PROSPECT = lacle,
                      NOMPRO = lenom,
                      PREPRO = leprenom,
                      AD1PRO = adr,
                      AD2PRO = adr2,
                      ADRES1_CAR = adr,
                      ADRES2_CAR = adr2,
                      PAYSPRO = "France"
                    };
    
                    try
                    {
                      // Add the new object to the Orders collection.
                      ledatac.PROSPECT_AJOUT.InsertOnSubmit(pro);
                      // Submit the change to the database.
                      ledatac.SubmitChanges();
                    }
    //LOG              
                    catch (Exception e)
                    {
                      strLog = "3è ACCES BASE DE DONNES - table PROSPECT_AJOUT ==> ECHEC " + "\n";
                      log2 errLog = new log2();
                      errLog.ErrorLog(e, cheminArchivage, strLog, logTime);
                      ctrLog = ctrLog + 1;
                    }
    
    
    
    // quand le mail est traité avec Succes (quand le try est reussi)
                    if (ctrLog < 1)
                    {
    
        // log           
                      //on incremente le log avec une ligne d'information sur ce mail 
                      strLog = " Mail du : " + ladateCre + " / nom : " + lenom + " / Marque : " + marque + " ==> INTEGRE ";
                      log2 noErr = new log2();
                      noErr.NoErrorLog(cheminArchivage, strLog, logTime);
    
    
      
        // ***-10-*** DEPLACEMENT DU MAIL ApRES TRAITEMENT dans rep Mails_traites ******
                      //lemail.Delete(DeleteMode.MoveToDeletedItems);
                      lemail.Move(idRepT);
    
                    } // fin du if (ctrLog < 1)
    
    
                  } // FIN DU TRY ( *** -6- )
    
    // quand le mail n'a pas été traité, l'erreur est traitée dans le catch ci dessous
                  catch (Exception e)
                  {
                    //LOG        
                    strLog = " Mail du : " + ladateCre + " / nom : " + lenom + " / Marque : " + marque + " ==> NON INTEGRE ";
                    log2 errLog = new log2();
                    errLog.ErrorLog(e, cheminArchivage, strLog, logTime);
                    ctrLog = ctrLog + 1;
                    // mail deplacé dans rep Mails_rejetes
                    lemail.Move(idRepR);
                  }
                  //TotFor = TotFor + 1;
                  //Console.WriteLine(TotFor);
    
                } // FIN DU fOR EACH (*** -6- *** )
    
    merci d'avance et bon appetit !
    jeudi 20 mai 2010 10:43
  • Bonjour,

    Votre code semble bon. Votre boucle peut-être cependant interrompue si une exception se produit dans un bloc "catch". Pouvez-vous nous confirmer qu'aucune exception se produit ?

    Au passage, ne traitez JAMAIS des exceptions avec catch (Exception e). Spécialisez toujours l'exception que vous voulez traiter ! Dans votre cas, traitez l'exception ChangeConflictException ou SqlException uniquement.

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    jeudi 20 mai 2010 20:01
    Modérateur
  •  

    Bonjour,

    essayer de formaliser votre bloc try-catch comme suit:

    foreach(e in email )

    {

    try

    {

    //Execution du bloc sensible aux exceptions

    catch(e exception)// il faut raffiner le contexe de l'exception

    {

    //traitement de l'erreur

    continue;

    }

    }

    }

    dimanche 23 mai 2010 13:03
  • Bonjour,

     

    Algeox, avez-vous réussi a découvrir l’erreur à partir de ces derniers conseils ?

     

    Cordialement,

    Alex

     

     

     

    __________________________________________________________________________________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

     

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework

     

    mardi 25 mai 2010 08:22