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.