Что нового

Как обработать ошибку при выполнении скрипта ?

Gromadina

Новичок
Сообщения
21
Репутация
1
Иногда при выполнении скрипта вылезают ошибки. Как отловить этот момент и соответственно выполнить какую нит функцию ? Если можно пример.

Примерно как структура в 1С:

Попытка
<Процедура1>
Исключение
<Процедура2>
КонецПопытки

т.е изначально выполняется <Процедура1>, но если в ней возникает ошибка (не важно какая), то выполняется <Процедура2>.

Заранее спасибо.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Код:
StringInStr(1, 1, 1, 'q')
If @error Then OnError()

Func1()
If @error Then OnError()


Func OnError()
	MsgBox(0, 'Error', 'Error')
EndFunc

Func Func1()
	SetError(1)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
На глобальном уровне (критичные ошибки) можно использовать AutoItErrorHandler.
А вообще лучше всего не допускать их изначально.

Gromadina [?]
Примерно как структура в 1С

Примерно так:

Код:
;Dim $TestVar = 0

If Not Proc1() Then
	Proc2()
Else
	Proc3()
EndIf

Func Proc1()
	If Not IsDeclared("TestVar") Then
		Return 0
	EndIf
	
	Return 1
EndFunc

Func Proc2()
	MsgBox(48, 'Title', 'Proc1 failed!')
EndFunc

Func Proc3()
	MsgBox(64, 'Title', 'Proc1 completed!')
EndFunc
 
Автор
G

Gromadina

Новичок
Сообщения
21
Репутация
1
там проблема какая:
подключаюсь к странице ie через $objIE = ObjCreate("InternetExplorer.Application"). Работает скрипт, отлавливает, заполняет и тестирует. Но бывает что INet отрубают и все - кирдык. Соответственно AutoIT ругается на то что: или страницы нет или данные на странице отсутствуют или элемента нет или функции и т.п.

Соответственно надо отловить err и проверить connect.

В этом случае исходя из вышеуказанного надо использовать AutoItErrorHandler. Так ?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
разбивай действия на более маленькие. проверяй чаще
Код:
While Not IsObj ($oIE)
	StartIE()
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
Gromadina [?]
AutoIT ругается на то что: или страницы нет или данные на странице отсутствуют или элемента нет или функции
У AutoIt'а таких ошибок нет, это видимо сообщения от IE, можно скрин увидеть?

В этом случае исходя из вышеуказанного надо использовать AutoItErrorHandler. Так ?
Не думаю. Скорее всего нужно использовать ObjEvent.
 
Автор
G

Gromadina

Новичок
Сообщения
21
Репутация
1
Скрина нет - ошибка вываливается примерно раз в два часа. Могу подробно описать:

Читаю web страницу. На ней нужно зарегиться: AutoIT-ом заполняю input поля и вызываю функцию submit().

После удачного рега срабатывает редирект на другую web страницу. После ее загрузки (в конце текста страницы) описана js функция, допустим func(). Эту функцию я вызываю при помощи AutoIT и с ней работаю.

Все гудно, но как писал выше через пару часов срабатывает timeout на web странице и она опять переходит на страницу регистрации. Соответственно AutoIt продолжает работать и пытается вызвать js функцию func() и соответственно ее не находит. Вот именно в этот момент вылетает ошибка.

Я сделал отлов, но только когда AutoIT полностью завершает цикл работы с func() - цикл соответственно повторяется до бесконечности. Но ошибка вылетает именно в тот момент когда цикл работы с func() еще не завершен.

Вызов функции func() делаю так:
$oDoc = $oIE.Document
$oDoc.script.func()

Как то так ...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
Gromadina [?]
Смутно. Всё же скрин нужен, я не могу понять откуда ошибка, т.е кто её производит, AutoIt или объекты IE.
 
Автор
G

Gromadina

Новичок
Сообщения
21
Репутация
1
ок. как тока появиться попробую скинуть
 

axlwor

Скриптер
Сообщения
657
Репутация
147
А делать как пользователь? Кликать на ссылки, картинки, формы? Если длинный период ожидания, можно _IEQuit(), потом снова _IECreate()
 

axlwor

Скриптер
Сообщения
657
Репутация
147
то есть?
у тебя программа (без конкретики)
Код:
StartIE()
LoginToSite()
While 1
   func()
   sleep($Period)
Wend

?

Тогда перед вызовом функции проверяй
Код:
IsObj($oIE)
, и залогинен ли ты по наличию чего нибудь на странице
игого
Код:
While 1
   if Not IsObj($oIE) then StartIE()
   if Not Что_то_на_странице_после_логина then LoginToSite()
   func()
   sleep($Period)
Wend
 
Автор
G

Gromadina

Новичок
Сообщения
21
Репутация
1
Скорее проверять не $oIE, а наличие самой функции func() на странице.
Кстати гудная мысль!
Скажите как можно проверить какие js функции доступны после загрузки на web странице ?
 
Автор
G

Gromadina

Новичок
Сообщения
21
Репутация
1
Решил так: чаще проверяю текст (на 1й странице он всегда есть), если его нет, то значит был редирект на другую и соответственно делаю повторную перезагрузку 1й страницы на которой уже есть нужная ф-ия.

А чаще проверяю - проверку воткнул еще и в сам цикл который работает с нужной ф-ей.

Всем спс.
 
Верх