Что нового

откат к началу после ошибки

saraconor

Новичок
Сообщения
404
Репутация
3
Не секрет что скомпилированные скрипты временами вылетают с ошибкой, это может быть связано с отсутствующей переменной, которую скрипт не успел назначить правильно (особо это заметно в больших мультифункциональных скриптах). Так вот, есть ли возможность в случае подобной ошибки откатить скрипт в сааамое начало, еще до назначения переменных и продолжить работу избежав вылета?
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
А чем это поможет?
Вы попробуйте запустить скрипт, словить ошибку и потом повторно запустить скрипт. Разве ошибка не повторится?
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
mef-t сказал(а):
А чем это поможет?
Вы попробуйте запустить скрипт, словить ошибку и потом повторно запустить скрипт. Разве ошибка не повторится?
бывает так называемый "плавающий дефект" функция может 20 раз нормально сработать а на 21 выдаст ошибку и скрипт встанет, помимо этого файл со скриптом может быть и не на моем компьютере.

есть функция
Код:
@error
, она перехватывает скрипт в момент ошибки и дает возможность изменить неизбежное) но ее тогда ведь надо пихать вообще везде

Код:
#include <Misc.au3>
$phpix = PixelSearch(520, 39, 557, 52, 0xFFFFFF)
if not @error = 1 then
$phpix1 = $phpix[0]&$phpix[1]
Else
$phpix1 = "пиксель не найден, избежали ошибки"
endif
msgbox(0,'',$phpix1)

в данном примере скрипт ищет белый пиксель в заданной области. если вывести сообщение с $phpix1 напрямую, то произойдет ошибка, т.к. в массив не сформировался и там нет строк которые msgbox может показать. а @error дает возможность переназначить испорченную переменную. Может есть возможность нечто подобное сделать для всего тела скрипта для всех функций разом? только вместо замены переменной скрипт будет откатываться к самому началу.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Я предлогаю такой вариант: сделать второй скрипт который будет запускать основной и по завершении основного проверять exitcode и если он не равен нулю то опять запускать...
типо
Код:
#NoTrayIcon
Local $sMainScriptPath = @ScriptDir&"\main.exe"
Local $iExitCode

For $c = 1 To 10
    $iExitCode = RunWait($sMainScriptPath)
    If $iExitCode = 0 Then ExitLoop
Next



Добавлено:
Сообщение автоматически объединено:

saraconor сказал(а):
бывает так называемый "плавающий дефект" функция может 20 раз нормально сработать а на 21 выдаст ошибку и скрипт встанет
У меня такое тоже бывает...
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Код:
#NoTrayIcon
Local $sMainScriptPath = @ScriptDir&"\main.exe"
Local $iExitCode

For $c = 1 To 10
    $iExitCode = RunWait($sMainScriptPath)
    If $iExitCode = 0 Then ExitLoop
Next



к сожалению нельзя, надо чтобы был 1 файл.
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
saraconor сказал(а):
бывает так называемый "плавающий дефект" функция может 20 раз нормально сработать а на 21 выдаст ошибку и скрипт встанет...
Это как раз является поводом задумать о причинах появления ошибки. Правильнее найти причину и исправить. А не пропускать.

Ошибки бывают разные, если нужны костыли, то можно воспользоваться вариантом alex33. Если нужен красивый инструмент, то программа должна работать без сторонних "перезапускаторов". Для этого Вы должны делать проверки во всех местах, где может возникнуть ошибка.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Попробуйте юзать - вдруг понравится
Код:
AutoItSetOption("MustDeclareVars", 1)


Объявите глобальные переменные - в самом начале и уюзайте их. Остальные переменные объявляйте в функциях и все будет хорошо.
Код:
#include <Misc.au3>

Global $STR_MSG = 0


	$STR_MSG = 'ERROR: Host is offline/unreachable or Other errors'
Local $iPing = Ping("autoit-script.ru", 250)
	If $iPing Then ; If a value greater than 0 was returned then display the following message.
		$STR_MSG = 'The roundtrip-time took: '& $iPing &'ms.'
	EndIf

	MsgBox(0, 'PING to...', $STR_MSG)


	$STR_MSG = 'ERROR: Color is not found'
Local $phpix = PixelSearch(520, 39, 557, 52, 0xFFFFFF)
	If Not @error = 1 then
		$STR_MSG = $phpix[0]&$phpix[1]
	EndIf

	MsgBox(0, 'PixelSearch to...', $STR_MSG)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
1. Лучше взять за правило исправить код. Даже если на 21 раз ошибка, очевидно, что она связана с изменением внешних условий. Например получал массив, а потому что данные всегда существовали, а так как вариант несуществования никогда не возникал, тут-то и зарыта ошибка. Сам через пол-года выявил такую в своей программе при пустой папке, когда анализ пустой папки бессмысленен, но бывает что пользователь не знает что папка пуста, а программа не должна от этого падать.

2. Так как вылет ошибки не подразумевает дальнейшую работу exe-файла, то я как бы не пытаюсь обмануть железную логику. Но можно используя тот же файл запустить второй процесс. То есть файл то один но работает он дважды. Первый запускает и переименовывает встроенное окно скрипта (AutoItWinSetTitle), второй процесс запускается из первого через AutoIt3ExecuteScript. Хотя нужно сохранить запускаемый скрипт в Temp-папке. И дальше второй процесс ловит окно ошибки и при успехе убивает окно и процесс, перезапуская exe-файл. Ну а первый процесс при наличии запущенного второго процесса не запускает его второй раз.
 
Верх