vba automation autoit

vba - Manejo de errores AutoIT



automation (2)

Tengo un código que generará un error después de un tiempo, quería manejar ese error. Una forma en que cualquier error se aplica a una función personalizada también lo hará.

Usualmente en VBA usábamos OnErrorGoTo Func y nuestro trabajo estaba hecho, no puedo encontrar algo similar en AutoIT.

Mi código

Func Start() while 1 if ProcessExists ( "Photoshop.exe" ) <> 0 Then Sleep(5000) Else Local $sFile ="C:/Auto/CodeToBe/Batch/Image Process-50-2D v.2-" & $n & ".jsxbin" Local $iPID = ShellExecute($sFile) Sleep(10000) $n = $n+1 EndIf WEnd EndFunc

Por supuesto, habrá un error cuando $ n sea mayor que la cantidad de archivos que he puesto en esa carpeta.

Una de las pocas cosas que intenté pero no funcionó, obtuve esto de la "SECCIÓN DE AYUDA" y una publicación en el foro.

Global $iEventError = 0 ; To be checked to know if COM error occurs. Must be reset after handling. Local $oMyError = ObjEvent("AutoIt.Error", "ErrFunc") ; Install a custom error handler Func Start() while 1 if ProcessExists ( "Photoshop.exe" ) <> 0 Then Sleep(5000) Else Local $sFile ="C:/Auto/CodeToBe/Batch/Image Process-50-2D v.2-" & $n & ".jsxbin" Local $iPID = ShellExecute($sFile) If $iEventError Then MsgBox($MB_OK, "", "There was an error on the previous line.") $iEventError = 0 ; Reset after displaying a COM Error occurred EndIf Sleep(10000) $n = $n+1 EndIf WEnd EndFunc ; This is my custom error handler Func MyErrFunc() Msgbox(0,"","ERROR GENERATED ON " & $n) Endfunc

Espero haber sido claro, si no, por favor avíseme, editaremos la pregunta para una mejor respuesta.


Aquí hay dos ejemplos. Recomendaría utilizar el segundo ejemplo porque, en primer lugar, debería evitar que se produzca un error. Sin embargo, el primer ejemplo se puede usar como un verificador de errores generales para la mayoría de los errores.

Ejemplo 1

Start() Func Start() Local $n = 1 While 1 If ProcessExists("Photoshop.exe") <> 0 Then Sleep(5000) Else Local $sFile = "C:/Auto/CodeToBe/Batch/Image Process-50-2D v.2-" & $n & ".jsxbin" Local $iPID = ShellExecute($sFile) If @error Then MyErrFunc(@ScriptLineNumber, @error) ;check for error Sleep(10000) $n = $n + 1 EndIf WEnd EndFunc ;==>Start ; error handler Func MyErrFunc($iLineNumer, $iError) $iLineNumer = $iLineNumer - 1 MsgBox(0, "", "ERROR GENERATED ON SCRIPT LINE: " & $iLineNumer & @CRLF & "ERROR CODE: " & $iError) EndFunc ;==>MyErrFunc

Ejemplo 2

Start2() Func Start2() Local $n = 1 While 1 If ProcessExists("Photoshop.exe") <> 0 Then Sleep(5000) Else Local $sFile = "C:/Auto/CodeToBe/Batch/Image Process-50-2D v.2-" & $n & ".jsxbin" If FileExists($sFile) Then Local $iPID = ShellExecute($sFile) Sleep(10000) Else ;handle error (you could use a function here if you wanted) ConsoleWrite("File not found: " & $sFile & @CRLF) EndIf $n = $n + 1 EndIf WEnd EndFunc ;==>Start2


Intenta implementar alguna comprobación de errores. Si no es FileExists (su cadena con el $ n) Entonces ... abortar más shellexecute ... Podría tratar de usar algo como _FileListToArray antes de iniciar el ciclo. Eche un vistazo al ejemplo en el gran archivo de ayuda.