Что нового

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

Gromadina

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

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

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

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

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

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
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 472
Репутация
2 401
На глобальном уровне (критичные ошибки) можно использовать 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 472
Репутация
2 401
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 472
Репутация
2 401
Gromadina [?]
Смутно. Всё же скрин нужен, я не могу понять откуда ошибка, т.е кто её производит, AutoIt или объекты IE.
 
Автор
G

Gromadina

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

axlwor

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

Gromadina

Новичок
Сообщения
21
Репутация
1
это не выход из ситуации :(
 

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й страницы на которой уже есть нужная ф-ия.

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

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