#NoTrayIcon
#AutoIt3Wrapper_Run_AU3Check=n
#AutoIt3Wrapper_Run_Before=%autoitdir%AutoIt3.exe /AutoIt3ExecuteLine "FileClose(FileOpen('%scriptdir%OAER_RAW_SRC.tmp', 2))"
#AutoIt3Wrapper_Run_After=%autoitdir%AutoIt3.exe /AutoIt3ExecuteLine "FileDelete('%scriptdir%OAER_RAW_SRC.tmp')"
#include <GUIConstantsEx.au3>
#include 'OnAutoItErrorRegister.au3'
_OnAutoItErrorRegister('', '', 'My App Error', False, False)
GUICreate('OnAutoItErrorRegister Example', 350, 200)
GUICtrlCreateLabel('This script is just an example.' & @CRLF & @CRLF & 'It will produce a syntax error in', 25, 40, 300, 50)
GUICtrlCreateLabel('5', 185, 50, 50, 40)
GUICtrlSetColor(-1, 0xF20000)
GUICtrlSetFont(-1, 30, 800, 0, 'Tahoma')
GUICtrlCreateLabel('seconds.', 220, 67, 300, 50)
GUICtrlCreateLabel('The result shown as a CUSTOM error message, you can change it!', 25, 120, 350, 20)
$iUnRegister_Bttn = GUICtrlCreateButton('UnRegister AutoItError handler', 25, 140, 200, 22)
GUICtrlCreateLabel('Copyright jennico, G.Sandler (MrCreatoR) © 2008 - 2015', 25, 170, 350, 80)
GUICtrlSetColor(-1, 0x808080)
GUICtrlSetFont(-1, 8.5, 800, 6)
GUISetState()
Dim $iTimer
For $i = 3 To 1 Step -1
GUICtrlSetData(4, $i)
$iTimer = TimerInit()
While TimerDiff($iTimer) < 1000
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $iUnRegister_Bttn
_OnAutoItErrorUnRegister()
EndSwitch
WEnd
Next
;We deliberately make a syntax mistake and call the error!
If Random(1, 5, 1) = 3 Then
MsgBox(0, '', )
Else
_NotExistingFunc()
EndIf
sorry i just don’t understand…a try/catch will only catch one error regardless of how many lines of code are within it. So you wouldn’t be saving any steps even if what you’re looking for existed, because you’d still have to Try…Catch every line that could raise an exception. you could do an adlib function that just watches the @error, but the thing is, you’re not going to want the same action performed on every @error, example, you don’t want the same code executed if a file couldn’t be opened as if a color you searched for with pixelsearch() wasn’t found. so what you do, is assign your function calls to variables, so that you can evaluate the return value and respond accordingly. It’s much less code to handle errors as they occur than to have a try/catch for everything that COULD error.
$file = FileOpen("C:test.txt",0) If $file = -1 then MsgBox(0,"Error","File could not be opened for reading") Exit EndIf $Search = PixelSearch(0,0,100,100,0xFFFFFF) If @error then MsgBox(0,"Error","Color not found")
That is why you always pass a variable with an @error function.
$ret=Run($str, $wd) If @error then catchIt($ret) do more stuff $ret=Run($str, $wd) If @error then catchIt("!Failed to run " & $str & ". From working directory " $ $wd) Etc. Func catchIt($er) Select Case $er=1 MsgBox(0, "Unknown Error", "Exiting") Exit Case StringLeft($er, 1)="!" MsgBox(0, "Error", $er) Case Etc, etc EndFunc With the variable passed to catchIt($) you can impart any information generic, general, or with simple tricks very specific to use to populate the info strings in a message bog, determine wether the app should be closed or not, etc etc... Link to comment Share on other sites More sharing options... seandisanti Posted January 10, 2006 seandisanti Active Members 2.9k Share Posted January 10, 2006 That is why you always pass a variable with an @error function.
$ret=Run($str, $wd)
If @error then catchIt($ret)
do more stuff
$ret=Run($str, $wd)
If @error then catchIt(«!Failed to run » & $str & «. From working directory » $ $wd)
Etc.
Func catchIt($er)
Select
Case $er=1
MsgBox(0, «Unknown Error», «Exiting»)
Exit
Case StringLeft($er, 1)=»!»
MsgBox(0, «Error», $er)
Case
Etc, etc
EndFunc
With the variable passed to catchIt($) you can impart any information generic, general, or with simple tricks very specific to use to populate the info strings in a message bog, determine wether the app should be closed or not, etc etc…
exactly, that was my point, that the way things are currently handled works very well when used correctly, and IMHO implementation of a Try…Catch structure would be considered unnecessary at best. It would require more code to achieve the same result. Try…Catch structures are to prevent crashes caused by unhandled exceptions. It’s actually going on in the background with Autoit, when you try to open a file for example, if there is an error, or the operation is unsuccessful for whatever reason, autoit catches the exception, and lets you know by setting @error. I could be completely wrong on this, but i believe that in order to actually allow true Try/Catch, they’d have to make an Opt() to pass exceptions to the script, rather than having it handled by autoit3.exe, and that would probably require additional code in functions that could cause an exception so that it’s executed differently depending on how that option is set
My AutoIt script generates an error that I want to handle. A way that any error goes to a custom function will also do. In VBA I use OnErrorGoTo
, but I am unable to find something similar in AutoIt.
My Code :
Func Start()
While 1
If ProcessExists ( "Photoshop.exe" ) <> 0 Then
Sleep(5000)
Else
Local $sFile ="C:AutoCodeToBeBatchImage Process-50-2D v.2-" & $n & ".jsxbin"
Local $iPID = ShellExecute($sFile)
Sleep(10000)
$n = $n+1
EndIf
WEnd
EndFunc
An error will occur when $n
exceeds the number of files in that folder. I tried this but didn’t work (from the «HELP SECTION» and a forum post):
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:AutoCodeToBeBatchImage 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
user4157124
2,75113 gold badges26 silver badges42 bronze badges
asked Nov 30, 2015 at 9:33
2
I recommend the second example because it prevents an error in the first place. However, the first example can be used as a general error checker.
Example 1
Start()
Func Start()
Local $n = 1
While 1
If ProcessExists("Photoshop.exe") <> 0 Then
Sleep(5000)
Else
Local $sFile = "C:AutoCodeToBeBatchImage 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
Example 2
Start2()
Func Start2()
Local $n = 1
While 1
If ProcessExists("Photoshop.exe") <> 0 Then
Sleep(5000)
Else
Local $sFile = "C:AutoCodeToBeBatchImage 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
user4157124
2,75113 gold badges26 silver badges42 bronze badges
answered Nov 30, 2015 at 14:20
MrAutoItMrAutoIt
7856 silver badges21 bronze badges
Try to implement error checking.
If Not FileExists(your string with the $n) Then
... abort
Else
shellexecute ...
You could use _FileListToArray()
instead.
user4157124
2,75113 gold badges26 silver badges42 bronze badges
answered Nov 30, 2015 at 10:13
XenobiologistXenobiologist
2,0911 gold badge12 silver badges16 bronze badges
1
An error will occur when
$n
exceeds the number of files in that folder.
As per Documentation — Function Reference — _FileListToArray()
:
Lists files andor folders in a specified folder (Similar to using Dir with the /B Switch)
Will loop over existing filenames only (avoiding error altogether). Example:
#include <File.au3>
Global Const $g_sPathFiles = 'C:AutoCodeToBeBatch'
Global Const $g_sMaskFile = '*.jsxbin'
Global Const $g_aFile = _FileListToArray($g_sPathFiles, $g_sMaskFile, $FLTA_FILES, True)
For $i1 = 1 To $g_aFile[0]
ShellExecuteWait($g_aFile[$i1])
Next
Alternatively _FileListToArrayRec()
may be used.
Related.
answered Jun 22, 2018 at 3:01
user4157124user4157124
2,75113 gold badges26 silver badges42 bronze badges
Если вы занимались пакетной обработкой в Adobe Photoshop с помощью инструмента Automate — Batch (пакетная обработка очень большого количества графических файлов с наложением на них фильтров из программы в автоматическом режиме), наверняка сталкивались с такого вида вылетами программы, по не понятным для меня причинам:
Конечно можно ждать появление этих ошибок, которые могут возникнуть через час обработки или через несколько часов, можно заводить будильник, чтобы просыпаться ночью
(как робот)
и смотреть: «а не вылетел ли Photoshop» с ошибкой? Потом
нервно
снова запускать обработку, отсортировывая уже обработанные файлы в другую папку.
В кратце вот и проблема! (Аналогично Вы сможете обрабатывать ошибки и от другого программного обеспечения). Решение?
Как возникли эти ошибки?
Я решил обработать видео, с помощью фильтров Photoshop. В VirtualDub импортировал Mov с помощью plugin-ов. Сделал раскадровку File — Export — Image Sequence, заказал имя файла, тип файла, количество цифр, папку. Экспортировал mov в огромное колчество bmp файлов и начал пакетную обработку в Photoshop. Результат обработки потом планировал через VirtualDub экспортировать уже в готовый файл avi, применив еще и фильтр Deshaker, который устранит дрожания камеры. Но тут начались вылеты Photoshop, например при простом сохранении в файл png ошибка «Because the file-format module cannot parse the file» (фотошоп выдает ошибку, о том, что он не может отпарсерить в файл-форматном модуле?)
Будем обрабатывать ошибки Photoshop с помощью скриптового языка AutoIt. Для этого нам потребуется запастись
кофе
терпением: ожидать появление ошибок, описать реагирование на них, протестировать, собрать готовое решение в виде exe файла с готовыми и автоматизированными действиями компьютера.
Окна об ошибках будем изучать с помощью инструмента AutoIt с названием AutoIt Windows Info. На удивление окна Adobe Photoshop не используют стандартные windows Api окна, но сообщения об ошибках программа видит без проблем:
if WinExists("Adobe Photoshop CS3 Extended","OK") then
WinWait("Adobe Photoshop CS3 Extended","OK")
;ждем окно 30 секунд с ошибкой и кнопкой OK и делаем его активным
sleep(3000)
WinActivate("Adobe Photoshop CS3 Extended","OK")
sleep(3000)
;ControlClick("Adobe Photoshop CS3 Extended","OK","[CLASS:Static; INSTANCE:2]")
;WinClose("Adobe Photoshop CS3 Extended","OK")
sleep(3000)
;msgbox(1,"1","1")
;окно для теста, что все нормально
;если не помогло нажатие на кнопку, просто закроем Adobe Photoshop
ProcessClose("Photoshop.exe")
endif
Аналогично можно закрыть ошибку с текстом Microsoft Visual C++ Runtime Library:
if WinExists("Microsoft Visual C++ Runtime Library","") Then
winwait("Microsoft Visual C++ Runtime Library","")
WinActivate("Microsoft Visual C++ Runtime Library","")
winclose("Microsoft Visual C++ Runtime Library","")
;msgbox(0,"First","1")
EndIf
sleep(10000)
if WinExists("Photoshop.exe - Application Error","OK") Then
winwait("Photoshop.exe - Application Error","OK")
WinActivate("Photoshop.exe - Application Error","OK")
controlclick("Photoshop.exe - Application Error","OK","[CLASS:Button; INSTANCE:1]")
EndIf
sleep(10000)
if WinExists("Photoshop.exe - Application Error","OK") Then
WinActivate("Photoshop.exe - Application Error","OK")
winwait("Photoshop.exe - Application Error","OK")
controlclick("Photoshop.exe - Application Error","OK","[CLASS:Button; INSTANCE:1]")
EndIf
sleep(10000)
Ошибки обрабатываются, программа закрывается. Необходимо запустить ее заново. Горячие клавиши для запуска пакетной обработки AdobePhotoshop в английской версии Alt+f (File) — u (aUtomate) — Alt+a (Action) — чтобы выбрать наш профиль для обработки — будем использовать клавиши стрелка вниз («на клавиатуре» — через скрипт соответственно), либо если не хотите использовать горячие клавиши — с помощью клавиатуры вверх-вверх, enter и т.д…
ShellExecute("C:Program FilesAdobeAdobe Photoshop CS3Photoshop.exe","","C:Program FilesAdobeAdobe Photoshop CS3")
sleep(30000)
;ждем подольше, иначе компьютер вслепую начнет отправлять нажатия клавиши в воздух!
IF WinExists("Adobe Photoshop CS3 Extended","") Then
WinActivate("Adobe Photoshop CS3 Extended","")
Send("!f")
;File
sleep(5000)
Send("u")
;aUtomate
sleep(5000)
Send("b")
;Batch
sleep(5000)
;старый вариант - через меню подъем курсора снизу вверх
;send("{UP}")
;sleep(10000)
;send("{UP}")
;sleep(10000)
;send("{UP}")
;sleep(10000)
;send("{UP}")
;sleep(1000)
;send("{UP}")
;sleep(10000)
;send("{UP}")
;sleep(10000)
;send("{UP}")
;sleep(10000)
;send("{ENTER}")
;sleep(10000)
;send("{ENTER}")
;sleep(10000)
;Set - выбираем - тип настроек профиля для обработки. В моем случае он третий по счету, поэтому нужно _нажать_ 2 раза клавишу на клавиатуре со стрелкой вниз
send("!t")
sleep(10000)
send("{DOWN}")
sleep(10000)
send("{DOWN}")
sleep(10000)
send("{ENTER}")
EndIf
Чему мы уже научили компьютер? Закрывать возникающие ошибки, запускать обработку Photoshop. Но при внимательном рассмотрении, компьютер начинает обработку в этой же папке, и не разбирается в том: обработан файл или еще нет, происходит «вторичная» обработка уже обработанных ранее файлов, а затем он переходит к файлам, которые необходимо обработать. Что же делать?
Будем обработанные файлы сохранять в другой формат, например png (растровый формат хранения графической информации, использующий сжатие без потерь по алгоритму Deflate). По именам сохранных файлов *.png будем удалять исходные наши файлы *.jpeg или *.bmp. Изучив документацию и примеры AutoIt, получился следующий скрипт (ищет файлы *.png — по их названиям стирает исходные файлы *.bmp).:
#include <file.au3>
#include <array.au3>
Dim $szDrive, $szDir, $szFName, $szExt
sleep(10000)
$flagvixod = 0
; Shows the filenames of all files in the current directory.
$search = FileFindFirstFile("*.png")
; Check if the search was successful
If $search = -1 Then
MsgBox(0, "Error", "No files/directories matched the search pattern")
;считаем что все обработано - т.к. нет уже готовых файлов png
Exit
EndIf
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
$TestPath = _PathSplit(@ScriptDir & "" & $file, $szDrive, $szDir, $szFName, $szExt)
;3 = name , 4 = extension
;получим имя файла png и заменим его на bmp и сотрем!
DelMyFile($TestPath[3] & ".bmp")
WEnd
Func DelMyFile($value)
;msgbox (0,"0",$value)
;return $value
If FileExists($value) Then
filedelete($value)
Else
Return $value
endif
EndFunc
Не забудьте дописать в пакетную обработку действие File — Save As… сохранение файла по сохранению png.
Осталось все это собрать в единый файл, «зациклить обработку» на поиск ошибок. Или добавить задание в планировщик задач windows (Scheduled Task), которое будет автоматически раз в несколько минут,
проверять
искать возникающую ошибку на экране компьютера и за нас принимать решение — закрывать их, закрывать программу, удалять исходные необработанные файлы (по списку сохраненных и уже обработанных), запускать заново Photoshop для обработки. Паузы в скрипте по 10-30 секунд добавлены для надежности, т.к. иногда после возникновения ошибок компьютер не вполне корректно и быстро реагирует на нажатия клавиш.
Одобрено: ASR Pro
Повысьте производительность вашего компьютера с помощью этой простой загрузки. г.
Вот несколько новых простых методов, которые должны помочь решить, я бы сказал, проблему с автоматической обработкой ошибок.
Привет всем, это личное сообщение является отправной точкой здесь. Я новичок в Autoit, а также только что поднял его в прошлом месяце. В настоящее время я работаю над проектом по автоматизации нашего собственного процесса загрузки выписки финансового учреждения с веб-сайта банка. Настоящая проблема, которую я покупаю, заключается в подготовке к устранению неполадок, когда возникает ошибка из-за сбоя / тайм-аута определенного веб-сайта. Я генерирую, чтобы перехватить событие ошибки, когда одно из наиболее часто связанных с ними событий выходит из строя с моими функциями _IE, потому что заполнение страницы зависло.
Одобрено: ASR Pro
ASR Pro — самый популярный и эффективный в мире инструмент для ремонта ПК. Миллионы людей доверяют ему обеспечение быстрой, бесперебойной и безошибочной работы своих систем. Благодаря простому пользовательскому интерфейсу и мощному механизму сканирования ASR Pro быстро находит и устраняет широкий спектр проблем Windows — от нестабильности системы и проблем с безопасностью до проблем с управлением памятью и производительностью.
FuncTest()Локальный $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")$WinHandle эквивалентно WinGetHandle("тестовый сайт")$oIE означает _IEAttach($WinHandle, "hwnd")$oFrame = _IEFrameGetObjByName($oIE, "leftFrame")$oDiv = _IEGetObjById($oFrame, "divFoldCont")$oDiv2 почти наверняка равен _IEGetObjById($oDiv, "divFold0")$oDiv3 = _IEGetObjById($oDiv2,"divFoldSub0_1")$oLinks равно _IELinkClickByText($oDiv3, "Выписка по счету")Спящий режим (1000) НО; Введите номер грида$oFrame = _IEFrameGetObjByName($oIE, "рабочая область")$oLinks = _IELinkGetCollection($oFrame) Для $oLink $oLinksНО; ConsoleWrite($oLink.href)_IEAction($oLink, "щелчок")сон (1000)Выходной цикл Далеерадио конецФункция _ErrFunc($oError)$ErrorMessage = (@ScriptName & cm ("& $oError.scriptline &"): ! ==> Обнаружена ошибка COM!"[email protected][email protected] & "err.number": & @TAB & @TAB & "0x" & Hex($oError.number) @CRLF & & [email protected] & "err.windescription:" & @TAB & $oError.win & @CRLF схема & [email protected] & "err.description: расстояние в дюймах & @TAB & $oError.& введите @CRLF & [email protected] & "err.source: & inch @TAB & @TAB & $oError.source & @CRLF & [email protected] & "err.Is: файл справки" & @TAB & $oError.helpfile & @CRLF & [email protected] & "err.helpcontext: ширина внутри дюймов & @TAB & $oError.helpcontext & @CRLF & [email protected] & "err.lastdllerror is: & " @TAB & $oError.lastdllerror & @CRLF & _& @tab "err.scriptline превратится в: " && @tab $oError.scriptline & @CRLF & [email protected] & "err.retcode: " @TAB & & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)EndFunc ;==>_ErrFunc
Я ожидал, что тип программы автоматически отправит мне существенное электронное письмо, чтобы сообщить мне, что процесс на самом деле не удался. Это электронное письмо выдается при обнаружении очень ошибочного события. Однако в этом и заключается условие. Мой сценарий все еще может поймать правильное сообщение об ошибке, если все работает. Во время _IEAttach появляется сигнал об ошибке.
–> Предупреждение функции IE.au3 T3.0-2 _IEAttach, невозможно зарегистрировать встроенную ошибку, невозможно перехватить ошибки COM (используйте _IEErrorHandlerRegister() с регистрацией пользовательского обработчик ошибок)
Как изменить сценарий, чтобы эта выборочная ошибка не запускала функцию обработки ошибок?
П.С. Я открыт для предложений по улучшению моего сценария.
P.S.S. Я не могу использовать _IECreate, потому что мне нужно войти на сайт с помощью физического одноразового пароля, поэтому мне в основном нужно войти на сайт онлайн перед запуском скрипта.
<цитата блока>
37 минут внутри jdelaney сказал:
Добавьте обработчик ошибок. Иногда, когда доминантный объект недоступен, при попытке помочь получить дочернее свойство или объект запись вступает в силу. _ieerrorhandlerregister, в любом случае.
Я нашел это практически через любой поиск Google и экспериментирую с ним. Достаточно того, что я выберу вашу пустую функцию, верно? Предположим, я хочу, чтобы вы ничего не могли сделать, кроме как игнорировать, см. ошибку. По идее мой цикл do-intil сделает все
РЕДАКТИРОВАТЬ: Ближе, хотя какой бы текст я ни пробовал, я помещаю его в консоль, и программа вылетает. Но кажется, по крайней мере, поймать эту отчетливую ошибку
>”C:Program FilesAutoIt3SciTE..autoit3.exe” /ErrorStdOut “C:Scriptsxxx.au3”
–> Запуск IE.au3 T3.0-2 из предупреждения _IETableGetCollection, $_IESTATUS_NoMatch
–> Задание IE.au3 T3.0-2 прервано из-за ошибки _IETableWriteToArray, $_IESTATUS_InvalidDataType
–> IE.au3 T3.0-2 Работа будет выполняться предупреждением _IETableGetCollection, $_IESTATUS_NoMatch
–> IE.au3 T3.0-2 Ошибка отображения результатов _IETableWriteToArray, $_IESTATUS_InvalidDataType
–> IE.au3 T3.0-2 Из пункта предупреждения _IETableGetCollection, $_IESTATUS_NoMatch
–> IE.au3 T3.0-2 Операционная ошибка $_IESTATUS_InvalidDataType
_ietablewritetoarray,
Повысьте производительность вашего компьютера с помощью этой простой загрузки. г.
г.