Page 1 sur 1

Gestion des erreurs

Posté : mar. 18 sept. 2018 11:20
par feuweu
Bonjour à vous, je débute autoit depuis quelques jours, venant de python je me demande comment gérer ou au moins rendre silencieuse une erreur, j'ai trouvé la macro @error mais je vois pas du tout comment l'utiliser. Pour éviter qu'on me jette la pierre je précise que j'ai déja fait des recherches mais que les personnes concernées demandaient des solutions à des cas bien trop poussés pour moi.

Merci d'avoir pris le temps de lire. :D

Re: Gestion des erreurs

Posté : mar. 18 sept. 2018 14:06
par mikell
En général @error est utilisé dans une condition If/Else/EndIf
Les fonctions intégrées AutoIt retournent une valeur pour @error : <> 0 si erreur, sinon 0
Pour faire retourner une valeur de @error par une fonction custom il faut utiliser SetError() dans cette fonction (c.f.le fichier d'aide)

Je sais, tout ça est plutôt vague. Pour une réponse plus précise merci de fournir un petit exemple concret :wink:

Re: Gestion des erreurs

Posté : mar. 18 sept. 2018 15:11
par feuweu
Merci pour la réponse, j'ai pas d'exemple sous la main, la macro SetError sert à créer et modifier la valeur de retour d'une erreur si j'ai bien compris. Mais pour comprendre imaginons que j'essaye d'atteindre quelque chose qui n'existe pas et que je veux que le script continue même si une erreur est rencontrée, qu'il passe simplement à la suite:

Code : Tout sélectionner

$aArray = [$valeur0,$valeur1]
MsgBox(0, "", $aArray[2])
Bien sûr ce code n'a aucun intérêt, en espérant avoir été plus compréhensible dans mes incompréhensions

Re: Gestion des erreurs

Posté : mar. 18 sept. 2018 15:56
par orax
Le script va s'arrêter sur ce type d'erreur. Il faut donc vérifier que la taille du tableau est suffisamment grande.
Global $aArray = [1, 2]
If UBound($aArray) > 2 Then MsgBox(0, "", $aArray[2])

Re: Gestion des erreurs

Posté : mar. 18 sept. 2018 21:19
par walkson
Bonjour,
Il n'y a pas comme en VBA de On Error resume next, il faut gérer les erreurs au cas par cas.
L'utilisation de fonctions permet de couper le code et de faire une gestion des erreurs plus fine. Si une fonction retourne une erreur non fatale, le code peut se poursuivre.
Mais il y a une multitude de manières de faire selon les circonstances. Dans l'exemple suivant, on recherche des nombres dans un texte avec différentes approches de la gestion d'erreur
#include <Array.au3>

Local $Array = StringRegExp("text sans nombre ","[0-9]",3) ;recherche de nombres dans le texte => error
;Return array of global matches.
If @error Then
   MsgBox(0,"Error",@error)
Else
   _ArrayDisplay($Array)
EndIf

Local $Array = StringRegExp("text sans nombre ","[0-9]",3)
If Not IsArray($Array) Then
   Local $Array[0] ;renvoie un array vide
EndIf
_ArrayDisplay($Array)

Local $Array = StringRegExp("text avec nombre 1 2 33 ","[0-9]",3) ;recherche de nombres dans le texte => succes
MsgBox(0, "retour", mafonction($Array))


Func mafonction($Array)
If Not IsArray($Array) Then
   Return SetError(1,1,"pas array")
Else
   _ArrayDisplay($Array)
EndIf
   Return SetError(0,0,"est array")
EndFunc
Remarque: si la fonction avait retournée une erreur cela n'aurait pas empêché le MsgBox d'apparaitre et de continuer le code

Re: Gestion des erreurs  

Posté : mar. 18 sept. 2018 21:35
par mikell
Pour développer, une erreur de syntaxe étant fatale le script plante tout bêtement. La gestion d'erreur dans le déroulement du script (par exemple "atteindre quelque chose qui n'existe pas") avec @error (ou pas) doit être programmée, c'est plutôt un truc comme ça

$result = _test(1)
MsgBox(0, "test1", $result & @crlf & @error)
$result = _test(2)
MsgBox(0, "test2", $result & @crlf & @error)

Func _test($n)
   Local $aArray[] = ["var0","var1"]
   If $n >= UBound($aArray) Then Return SetError(1, 0, "erreur")
   Return $aArray[$n]
EndFunc

Re: Gestion des erreurs

Posté : mer. 19 sept. 2018 11:01
par feuweu
Merci pour toutes ces méthodes, je vais tester tout ça