Page 1 sur 1
[R] Rendre une erreur silencieuse.
Posté : lun. 14 févr. 2011 15:19
par lokidor
Bonjour à tous,
J'ai un petit problème dans ma plantation ... ha non c'est pas ici? j'me suis trompé? OK, je sors
Trêve de pitreries!
J'ai un petit prog qui permet de créer un ou des utilisateurs sur une machine distante.
Au début, je teste si le compte en question n'existe pas déjà.
Le soucis, c'est que j'ai une erreur COM non bloquante qui sort au moment du test pour me dire que l'utilisateur n'existe pas... comme je le désire justement. (youhouuuu trop bien...)
Sauf que quand j'aurais 200 traitements à faire passer, j'ai pas envie de m'amuser à cliquer sur OK à chaque fois .
J'ai tenté de mettre en place de quoi gérer l'erreur mais il me sort une autre erreur COM disant : "Can't install a new Errorhandler when one is still active". Alors moi je veux bien, mais je ne sais pas ou se trouve le premier...
Si quelqu'un à une idée pour faire passer l'erreur en silencieuse, je suis preneur
Code : Tout sélectionner
Func MyErrFunc()
; when COM/Obj error then only set flag and do nothing
SetError(1)
EndFunc
Func CreateAccount($strUserName,$strFullName,$strPassword,$strGroup,$Computer,$description_PRU)
$objErr = ObjEvent("AutoIt.Error","MyErrFunc")
$objUser = ObjGet("WinNT://" & $Computer & "/" & $strUserName);on vérifie si l'objet existe ou non et c'est cette ligne qui renvoie l'erreur indésirable
Re: [..] Rendre une erreur silencieuse.
Posté : lun. 14 févr. 2011 15:46
par sksbir
Bonjour
Je dirais comme ça que ta déclaration $objErr = ObjEvent("AutoIt.Error","MyErrFunc") doit se faire dans le corps principal de ton script afin d'être appelé une seule fois. Ton erreur doit survenir au 2eme appel de ta fonction "createaccount"
Par ailleurs, pense à remettre $objUser ="" à la fin de ta fonction, ou alors met également la déclaration de $objUser dans le corps principal afin d'optimiser l'invocation de l'objet .
Re: [..] Rendre une erreur silencieuse.
Posté : lun. 14 févr. 2011 16:08
par lokidor
sksbir a écrit :
Je dirais comme ça que ta déclaration $objErr = ObjEvent("AutoIt.Error","MyErrFunc") doit se faire dans le corps principal de ton script afin d'être appelé une seule fois. Ton erreur doit survenir au 2eme appel de ta fonction "createaccount"
Je ne pense pas que cela vienne de là car je fait mes tests avec un seul enregistrement pour le moment. Je suis cependant quand même allé tester, et le problème persiste. Il me dit toujours que j'ai deux errorhandlers et que ça ne lui plait vraiment pas.
D'après vous, un ErrorHandler possède forcément le mot clef $objerror? Si non, y a t'il un moyen d'identifier une telle fonction? Le script n'est pas à moi, mais à mon prédécesseur qui n'est plus là pour répondre à mes questions :/
Sinon, d'autres idées?
Re: [..] Rendre une erreur silencieuse.
Posté : lun. 14 févr. 2011 16:27
par GaRydelaMer
Bonjour
c'est assez difficile de te répondre car dans le script que tu nous donnes il en manque beaucoup. Il n'y aurait pas une gestion d'erreur dans un fichier inclus ?
Pour répondre à ta question: ConsoleWrite(ObjEvent("AutoIt.Error")) va t'indiquer qu'elle est la fonction de gestion d'erreur en cours si elle est présente. Une fois son nom afficher, il te restera plus qu'à la trouver dans le script.
Edit:
De plus c'est une technique que j'emploie pour utiliser une gestion d'erreurs alternative dans certaine fonction:
1/ J'ai une gestion centraliser des erreurs: F1
2/ Une fonction qui ne doit pas être bloquante, je change de gestion d'erreur:
Local $oldFonctionErreur = ObjEvent("AutoIt.Error")
$oMyError = ObjEvent("AutoIt.Error", "MyNewErrFunc")
3/ à la fin du traitement je peux ainsi restaurer la fonction
$oMyError = ObjEvent("AutoIt.Error", $oldFonctionErreur )
Re: [..] Rendre une erreur silencieuse.
Posté : lun. 14 févr. 2011 17:05
par lokidor
C'est pile poil ce que je recherche, je n'ai pas le temps ce soir, mais demain j'essayerais.
Merci beaucoup et bonne soirée à tous
Re: [..] Rendre une erreur silencieuse.
Posté : mar. 15 févr. 2011 10:27
par lokidor
Après un petit essai, j'ai l'erreur suivante :

- Screen001.jpg (39.1 Kio) Vu 1756 fois
Une idée pour contourner ce problème?
Voila mon script actuel, j'ai peut-être écrit une abération... :/
Code : Tout sélectionner
Local $oldFonctionErreur = ObjEvent("AutoIt.Error")
$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $GO
.
.
.
; les erreurs à traiter sont dans les deux Case.
Case $Liste
.
.
.
EndSwitch
$oMyError = ObjEvent("AutoIt.Error", $oldFonctionErreur )
Re: [..] Rendre une erreur silencieuse.
Posté : mar. 15 févr. 2011 15:18
par Tlem
Peut être que la fonction
IsObj serait utile pour tester avant.

Re: [..] Rendre une erreur silencieuse.
Posté : mar. 15 févr. 2011 15:36
par lokidor
Salut Tlem.
Merci pour ta réponse, mais je ne suis pas sur de comprendre.
En fait l'erreur est faite dans un fichier appartenant à AutoIT et qui gère les fonctions d'Active Directory.
Dois-je aller modifier ce fichier?
Désolé si je parais un peu lourd, mais là je ne comprends vraiment pas le pourquoi du comment de cette erreur, enfin, le pourquoi je le comprends comprends, mais pas le comment.
Re: [..] Rendre une erreur silencieuse.
Posté : mar. 15 févr. 2011 17:42
par Tlem
lokidor a écrit :l'erreur est faite dans un fichier appartenant à AutoIT
Dans mon installation standard de AutoIt, je n'ai pas ce fichier adfunctions.au3, donc ce fichier est un UDF que vous avez surement récupéré sur le forum Anglais.
Il se peut qu'une erreur se soit glissé dans ce code, ou tout simplement, la fonction que vous utilisez attend un objet en argument et vous ne le lui donnez pas.

Re: [..] Rendre une erreur silencieuse.
Posté : mer. 16 févr. 2011 09:02
par lokidor
Mhh je comprends.
Donc en gros il faut que j'aille voir dans les adfunctions et que je fasse passer le système d'erreur en objet...
Ou que je passe en Hexa comme eux. Je vais me documenter.
Pour les UDF, j'ignorais jusqu'à leur existence. En fait je récupère un projet commencé par mon prédécesseur qui, comme son nom l'indique, n'est plus là. Or je touche pour la première fois de ma vie à de l'autoIT. Bref, je m'en sort pas trop mal car c'est un langage assez intuitif je trouve, mais il me reste bien des facettes assez subtiles à découvrir
Et pour être honnête, je suis ravie de les découvrir en votre compagnie à tous.
Merci encore, je vais voir ce que je peux faire pour mon problème, mais sinon la réponse de GaRydelaMer est vraiment très adaptée à ce que je cherchais.
► Afficher le texte
GaRydelaMer a écrit :
Pour répondre à ta question: ConsoleWrite(ObjEvent("AutoIt.Error")) va t'indiquer qu'elle est la fonction de gestion d'erreur en cours si elle est présente. Une fois son nom afficher, il te restera plus qu'à la trouver dans le script.
Edit:
De plus c'est une technique que j'emploie pour utiliser une gestion d'erreurs alternative dans certaine fonction:
1/ J'ai une gestion centraliser des erreurs: F1
2/ Une fonction qui ne doit pas être bloquante, je change de gestion d'erreur:
Local $oldFonctionErreur = ObjEvent("AutoIt.Error")
$oMyError = ObjEvent("AutoIt.Error", "MyNewErrFunc")
3/ à la fin du traitement je peux ainsi restaurer la fonction
$oMyError = ObjEvent("AutoIt.Error", $oldFonctionErreur )
Re: [R] Rendre une erreur silencieuse.
Posté : jeu. 24 févr. 2011 16:10
par airday
j'ai eu un soucis similaire avec la gestion d'erreur dans le browser. Le script ne peux prendre la main sur le message d'erreur de sécurité (mauvais user/password ou simplement un avertissement que le nouvel URL n'est pas en session sécurisée), il semble bloqué dans l'attente d'une réaction sur ce dernier.
Un script externe me liste bien la fenêtre (d'erreur) et peu interagir mais pas le script à l'origine du message.
J'ai ajouter un systeme de flag (fichier temporaire pour faire simple) et lancer un script externe avant mon action qui intervient si le message apparait.
le systeme de flag me permet de passer des messages entre les 2 processus et de couper le second une fois l'etape de ce message d'erreur passée (il n'y a pas toujours une erreur).
cela fonctionne parfaitement dans mon cas.