Try catch and Resume ! [Résolu]

thonyboy 166 Messages postés mercredi 23 avril 2003Date d'inscription 16 février 2011 Dernière intervention - 20 juil. 2009 à 14:22 - Dernière réponse : thonyboy 166 Messages postés mercredi 23 avril 2003Date d'inscription 16 février 2011 Dernière intervention
- 22 juil. 2009 à 14:25
Bonjour

J'ai un programme qui créé un certains nombre de fichiers sur le partage d'un serveur.
Hors de temps en temps le programme se vautre a cause d'une exception (je ne sais plus laquelle) qui dit que le partage n'est plus dispo.
Je pense que ce probleme arrive lorsque le serveur est un peu saturé, ou bien peut etre ce sont des micros coupures sur le réseau.
Toujours est t'il que j'aimerais bien quand ca arrive relancer une deuxieme tentative, mais voila je ne sais pas comment faire !

Voici mon code actuel

For Each objItem In colItems
cpt = cpt + 1
total = total + 1
Dim o As Redemption.SafeMailItem
'Création du MSG
o = CreateObject("Redemption.SafeMailItem")
o.Item = objItem
o.SaveAs(sousrep + cpt.ToString("ad0000000000") + ".msg", Redemption.rdoSaveAsType.olRFC822)
o = Nothing
'Changement de la date du fichier créé a la date du message
System.IO.File.SetLastWriteTime(sousrep + cpt.ToString("ad0000000000") + ".msg", objItem.ReceivedTime)
' Si le fichier n'est pas lu on le met en caché
If objItem.unread Then
System.IO.File.SetAttributes(sousrep + cpt.ToString("ad0000000000") + ".msg", System.IO.FileAttributes.Hidden)
End If
Status.Text = "Traitement de [" + objFolder.Name + "] " + cpt.ToString + "/" + tot.ToString


Me.Refresh()
System.Windows.Forms.Application.DoEvents()
Next

donc j'aimerais faire un truc comme ca

For Each objItem In colItems
TRY
cpt = cpt + 1
total = total + 1
Dim o As Redemption.SafeMailItem
'Création du MSG
o = CreateObject("Redemption.SafeMailItem")
o.Item = objItem
o.SaveAs(sousrep + cpt.ToString("ad0000000000") + ".msg", Redemption.rdoSaveAsType.olRFC822)
o = Nothing
'Changement de la date du fichier créé a la date du message
System.IO.File.SetLastWriteTime(sousrep + cpt.ToString("ad0000000000") + ".msg", objItem.ReceivedTime)
' Si le fichier n'est pas lu on le met en caché
If objItem.unread Then
System.IO.File.SetAttributes(sousrep + cpt.ToString("ad0000000000") + ".msg", System.IO.FileAttributes.Hidden)
End If
Status.Text = "Traitement de [" + objFolder.Name + "] " + cpt.ToString + "/" + tot.ToString


Me.Refresh()
System.Windows.Forms.Application.DoEvents()
CATCH EX AS EXCEPTION
If Ex = Mon erreur then RETRY ' C'est ici que je ne sais pas comment lui dire rééssaye la ou ca a planté !
Next

Si quelqu'un a une idée....

Merci d'avance
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 20 juil. 2009 à 19:36
3
Merci
Salut !

Hooo ! Joli mélange de VBS et de .Net... (je parle de CreateObject), Bref !

For Each objItem In colItems 
TRY 
cpt = cpt + 1 
total = total + 1 
Dim o As Redemption.SafeMailItem 

o = CreateObject("Redemption.SafeMailItem") 
o.Item = objItem 
Dim FileStr As String = sousrep + cpt.ToString("ad0000000000") + ".msg", Redemption.rdoSaveAsType.olRFC822
o.SaveAs(FileStr) 
'C'est sur la ligne au dessus que ton fichier est enregistré donc c'est ici que l'erreur survient 
'De plus c'est une System.Runtime.InteropServices.COMException <=== COM pour un composant com, ce qui veut dire que
'L'exception est bien généré par ton Ax.

o = Nothing 
Retry:
System.IO.File.SetLastWriteTime(FileStr, objItem.ReceivedTime) 
'La ligne du dessus aussi une erreur d'accès peut être généré
 
If objItem.unread Then 
System.IO.File.SetAttributes(FileStr, System.IO.FileAttributes.Hidden) 
End If 
Status.Text = "Traitement de [" + objFolder.Name + "] " + cpt.ToString + "/" + tot.ToString 

Me.Refresh() 
System.Windows.Forms.Application.DoEvents() 
Catch Ex As Exception
'Ici 
If Not TypeOf (ex) Is COMException Then
   If MsgBox ("Une erreur est survenue durant la création du fichier" & vbcr & FileStr,  _
              MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo, "Erreur") = MsgBoxResult.Yes Then
       Goto Retry
   End If
End If
'Attention cependent, si tu es tenté d'enlevé le message, fais gaffe à la boucle infinie en cas de coupure permanante de connexion.
'Idem, je t'ai donné un modèle, applique le même pour les erreurs éventuelles IO.File.. 
Next 


@+

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.

Merci Mayzz 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de Mayzz
thonyboy 166 Messages postés mercredi 23 avril 2003Date d'inscription 16 février 2011 Dernière intervention - 20 juil. 2009 à 14:51
0
Merci
Pour l'erreur voici ce que j'ai

System.Runtime.InteropServices.COMException (0x80004005): Cannot create file \\MAIL\BAL$\&AMk-l&AOk-ments supprim&AOk-s.IMAP\ad0000002459.msg. GetLastError: 64 (0x00000040): Le nom réseau spécifié n'est plus disponible.
Commenter la réponse de thonyboy
thonyboy 166 Messages postés mercredi 23 avril 2003Date d'inscription 16 février 2011 Dernière intervention - 20 juil. 2009 à 20:35
0
Merci
Salut, et Merci Merci Merci

Bon en même temps j'avais oublié l'existence du GOTO !!!!

Donc je vais suivre ton idée et donc agrémenter mon cocktail .net et vbs avec un zeste de VB6
Je vais enlever le message et rajouter une variable et le nombre de retry.

Mais en tout cas ta solution ddevrait faire le Job, donc c'est du tout bon. Et puis toi tu prends vraiment le temps de répondre.

Tu serais là, je te payerais une ptite mousse.

Encore merci et a +

Anthony
Commenter la réponse de thonyboy
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 20 juil. 2009 à 21:19
0
Merci
Merci pour la mousse virtuelle

J'ai juste omis je te dire, mais tu dois t'en douter :

 System.IO.File.SetAttributes(FileStr, System.IO.FileAttributes.Hidden) 


Peut aussi provoquer une exception en cas d'erreur d'accès au fichier.

Sinon en effet c'est un drôle de mélange... Attention au ActiveX pour la protabilité sur les systèmes x64 tout de même !

@+ Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
thonyboy 166 Messages postés mercredi 23 avril 2003Date d'inscription 16 février 2011 Dernière intervention - 21 juil. 2009 à 09:06
0
Merci
Bonjour

Je reviens la dessus pour une question et une remarque

Alors de mon point de vue l'étiquette Retry est mal placée car elle devrait avant la ligne :
Dim FileStr As String = sousrep + cpt.ToString("ad0000000000") + ".msg", Redemption.rdoSaveAsType.olRFC822

Sinon ma question :

La ligne If Not TypeOf (ex) Is COMException Then me pose un probleme
En effet, je débute mais j'ai l'impression qu'elle dit "si le type de l'exception n'est pas de type ComException" hors tu me dis que l'exception est de ce type....
Commenter la réponse de thonyboy
thonyboy 166 Messages postés mercredi 23 avril 2003Date d'inscription 16 février 2011 Dernière intervention - 21 juil. 2009 à 09:23
0
Merci
Encore une question

Est ce qu'il n'est pas préférable de mettre l'étiquette Retry avant le Try

En effet, comme je te l'ai dit j'ai mis un compteur afin de faire 3 essais avant de lacher l'affaire

Donc
Try
retry2:

                    o.SaveAs(sousrep + cpt.ToString("ad0000000000") + ".msg", Redemption.rdoSaveAsType.olRFC822)
                    o = Nothing
                    'Changement de la date du fichier créé a la date du message
                    System.IO.File.SetLastWriteTime(sousrep + cpt.ToString("ad0000000000") + ".msg", objItem.ReceivedTime)
                    ' Si le fichier n'est pas lu on le met en caché
                    If objItem.unread Then
                        System.IO.File.SetAttributes(sousrep + cpt.ToString("ad0000000000") + ".msg", System.IO.FileAttributes.Hidden)
                    End If
                    Status.Text = "Traitement de [" + objFolder.Name + "]  " + cpt.ToString + "/" + tot.ToString


                    Me.Refresh()
                    System.Windows.Forms.Application.DoEvents()
                Catch Ex As Exception
                    If TypeOf (Ex) Is COMException Then
                        ret = ret + 1
                        If ret < 4 Then GoTo Retry2
                        MsgBox("Une erreur est survenue au cour de la transformation du PST !" + vbCr + Ex.Message + vbCr + "L'application va se fermer")
                        Me.Close()
                    End If
                End Try


Mais en supposant que ca plante 2 fois.
Il y a plantage une premiere fois, je vais donc a retry2:
Si il y a un 2eme plantage, l'exception sera t'elle traitée par le catch ?
Commenter la réponse de thonyboy
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 21 juil. 2009 à 12:25
0
Merci
Salut,

En effet je me suis un petit peu planté , je t'ai répondu un peu vite ("Et puis toi tu prends vraiment le temps de répondre." )

Du coup j'ai pris 5 mn pour étudier ton code :

        For Each objItem In colItems
            '
            Ret = 0
            cpt += 1
            total += 1
            '
            Dim o As Redemption.SafeMailItem
            o = CreateObject("Redemption.SafeMailItem")
            o.Item = objItem
            '
            Dim FileStr As String = _
                sousrep + cpt.ToString("ad0000000000") + _
                ".msg", Redemption.rdoSaveAsType.olRFC822
            Try
                '
Retry:          o.SaveAs(FileStr)

Retry2:         System.IO.File.SetLastWriteTime(FileStr, objItem.ReceivedTime)

                If objItem.unread Then
                    System.IO.File.SetAttributes(FileStr, System.IO.FileAttributes.Hidden)
                End If

                Status.Text = "Traitement de [" + objFolder.Name + "] " + cpt.ToString + "/" + tot.ToString

                Me.Refresh()
                System.Windows.Forms.Application.DoEvents()
            Catch Ex As Exception
                '
                If TypeOf (Ex) Is COMException Then
                    '
                    ret += 1
                    If ret < 4 Then GoTo Retry
                    MsgBox("Une erreur est survenue au cour de la transformation du PST !" + vbCr + _
                           Ex.Message + vbCr + "L'application va se fermer")
                    Me.Close()
                    '
                ElseIf TypeOf (Ex) Is System.IO.DirectoryNotFoundException Then
                    '
                    ret += 1
                    If ret < 4 Then GoTo Retry2
                    MsgBox("Une erreur est survenue au cour de la transformation du PST !" + vbCr + _
                           Ex.Message + vbCr + "L'application va se fermer")
                    Me.Close()
                    '
                End If
                '
            Finally
                '
                o = Nothing
                '
            End Try
            '
        Next


En fait ici on sépare les 2 type d'erreurs possible, cela ne sert à rien de réécrire le fichier si le plantage survient au moment du changement des attributs, du coup on à 2 retry.

Dis moi si ça te convient, j'ai pas testé le code. Pour le try, ou cela fonctionne car lors ce que tu renvois vers Retry ou Retry2 ceux-ci sont dans le bloc try/catch, celui-ci est géré différement de On Error.

Tu peux aussi créer un Ret2, pour avoir 4 tentative par type d'erreur, avec ce code c'est 4 tentative pour quelque soit le type.

@+ Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
thonyboy 166 Messages postés mercredi 23 avril 2003Date d'inscription 16 février 2011 Dernière intervention - 22 juil. 2009 à 14:25
0
Merci
Salut

Génial. Tout fonctionne impec.

Encore une choppe de Merci !

@+

Anthony
Commenter la réponse de thonyboy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.