Что нового

OnAutoItErrorRegister - Обработка критических ошибок AutoIt

Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
ShSergey [?]
что нужно сделать чтобы значение глобальной переменной $VerPrinttest при использовании _OnAutoItErrorRegister("_MyErrorHandler") было верное ?
Задать HotkeySet после _OnAutoItErrorRegister.
 

lesandr

Новичок
Сообщения
5
Репутация
0
Добрый день!

При возникновении ошибки для рестарта скрипта использую:

Код:
Func _MyErrorHandler() ;Restart the application
   
    Local $sRunLine = @AutoItExe & ' "' & @ScriptFullPath & '"'
   
    If @Compiled Then
        $sRunLine = @ScriptFullPath
    EndIf
   
    Run($sRunLine, @ScriptDir)
EndFunc


Подскажите как в эту функцию встроить запись ошибки которая была возникла (сообщение и номер строки) в лог-файл?

Спасибо.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
lesandr [?]
как в эту функцию встроить запись ошибки которая была
Добавил в новой версий:

v1.8
+ Добавлена совместимость с 3.3.12.0.
+ Добавлена функция _OnAutoItErrorUnRegister (см. Пример 1).
* Теперь callback-функция ($sFunction) в _OnAutoItErrorRegister всегда принимает 4 парааметра ($sScriptPath, $iScriptLine, $sErrDesc, $vParams).
* Внутренние функции переименованы с __OnAutoItErrorRegister_* на __OAER_*.
* Убрано использование командной строки для определения повторного запуска скрипта.
* Более стабильное определение сообщения об ошибке AutoIt (при $bUseStdOutMethod = False).
* Исправлена проблема когда главный скрипт (или другая UDF) использует Opt('MustDeclareVars', 1).
 

lesandr

Новичок
Сообщения
5
Репутация
0
Спасибо за новую версию.

В своем скрипте использую много
Код:
ConsoleWrite()
для трасировки.

В новой версии при ошибке в переменную $sMessage функции _MyErrorHandler() записываются все данные которые были отправлены в консоль вместе с информацией об ошибке.

Пример:

Код:
#NoTrayIcon
#include 'OnAutoItErrorRegister.au3'

_OnAutoItErrorRegister('_MyErrorHandler');, '', -1, -1, True)

;We deliberately make an array bounding error and call the error!

ConsoleWrite("Bla 1" & @CRLF)
ConsoleWrite("Bla 2" & @CRLF)
ConsoleWrite("Bla 3" & @CRLF)
ConsoleWrite("Bla 4" & @CRLF)

Dim $aArr[1]
MsgBox(0, '', $aArr[1])

Func _MyErrorHandler($sScriptPath, $iScriptLine, $sErrDesc, $vParams) ;Restart the application
    Local $sMessage = StringFormat('SCRIPT FILE:\n%s\n\nSCRIPT ERROR LINE:\n%s\n\nERROR DESCRIPTION:\n%s', $sScriptPath, $iScriptLine, $sErrDesc)

    If MsgBox(16 + 4, 'Crash recieved!', 'Restart application?' & @CRLF & @CRLF & $sMessage) <> 6 Then
        Return
    EndIf

    Local $sRunLine = @AutoItExe & ' "' & @ScriptFullPath & '"'

    If @Compiled Then
        $sRunLine = @ScriptFullPath
    EndIf

    Run($sRunLine, @ScriptDir)
EndFunc


Так должно быть? Если да то можно ли в $sMessage отправлять только информацию об ошибке?

Пока что для себя быстро решил таким способом:

Код:
$sMessage = StringMid($sMessage, StringInStr($sMessage, "SCRIPT ERROR LINE"), StringLen($sMessage) - StringInStr($sMessage, "SCRIPT ERROR LINE"))
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
lesandr [?]
В новой версии при ошибке в переменную $sMessage функции _MyErrorHandler() записываются все данные которые были отправлены в консоль вместе с информацией об ошибке.
И не только это, при любом использовании ConsoleWrite будет срабатывать функция обработчика ошибок.
Значит используйте обычный режим ($bUseStdOutMethod = False).

Так должно быть?
Да, отлов в режиме $bUseStdOutMethod читает Stdout поток.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновил немного, исправил кое какие ошибки, включая конфликт с ConsoleWrite.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновление...

v1.9
+ Добавлено определение строки с ошибкой для скомпилированного скрипта (для отображения самой строки которая вызвала ошибку).
Скрипт должен быть запущен перед компиляцией (после любого изменения в нём), или используйте '#AutoIt3Wrapper_Run_Before=%autoitdir%\AutoIt3.exe "%in%" /BC_Strip' в основном скрипте.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Ещё немного обновил (версия та же)...

v1.9
+ Добавлено определение строки с ошибкой для скомпилированного скрипта (для отображения самой строки которая вызвала ошибку).
Скрипт должен быть запущен перед компиляцией (после любого изменения в нём), или используйте '#AutoIt3Wrapper_Run_Before=%autoitdir%\AutoIt3.exe "%in%" /BC_Strip' в основном скрипте.
!!! НЕ используйте Au3Stripper при компиляции скрипта.
+ Добавлено определение повторного запуска обработчика (для предотвращения многократного рекурсивного запуска).
* Исправлена проблема с ком. строкой.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновление...

v2.0
* Библиотека переписана (использованы методы с библиотеки AutoItErrorTrap).
- Изменён синтаксис, см. описание к функции вызова.
* Убрана поддержка AutoIt 3.3.8.1.
+ Добавлена возможность захвата экрана при ошибке. Файл может быть отправлен как вложение при использовании функции "Send Bug Report".
 

Naisho

Знающий
Сообщения
86
Репутация
12
Вопросик - будут ли отлавливаться ошибки, приводящие к тихому (без окна ошибки) краху компилированного скрипта если они скорее всего com природы и происходят несмотря на наличие такой вот конструкии в качестве ловушки для com-ошибок:
Код:
$__g_oTemplateCOMErrorHandler = ObjEvent("AutoIt.Error", "Template_COMErrFunc")
Func Template_COMErrFunc()
    Return Call("__DeluxeComErrorHandlerFunction",$__g_oTemplateCOMErrorHandler)
EndFunc

Func __DeluxeComErrorHandlerFunction($errorEvent)
    If IsObj($errorEvent) Then

        ConsoleWrite("!--> DeluxeComErrorHandler: COM Error Encountered in " & @ScriptName & @CR)
        ConsoleWrite("----> Scriptline = " & $errorEvent.scriptline & @CR)
        ConsoleWrite("----> Number Hex = " & Hex($errorEvent.number, 8) & @CR)
        ConsoleWrite("----> Number = " & $errorEvent.number & @CR)
        ConsoleWrite("----> Win Description = " & StringStripWS($errorEvent.WinDescription, 2) & @CR)
        ConsoleWrite("----> Description = " & StringStripWS($errorEvent.description, 2) & @CR)
        ConsoleWrite("----> Source = " & $errorEvent.Source & @CR)
        ConsoleWrite("----> Help File = " & $errorEvent.HelpFile & @CR)
        ConsoleWrite("----> Help Context = " & $errorEvent.HelpContext & @CR)
        ConsoleWrite("----> Last Dll Error = " & $errorEvent.LastDllError & @crlf)
		ConsoleWrite("----> Last Dll Error = " & $errorEvent.ScriptName & @crlf)

        Local $HexNumber = Hex($errorEvent.number, 8)
        SetError($HexNumber)
    Else
        SetError(1)
    EndIf
    Return 0
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Naisho [?]
будут ли отлавливаться ошибки, приводящие к тихому (без окна ошибки) краху компилированного скрипта если они скорее всего com природы и происходят несмотря на наличие такой вот конструкии в качестве ловушки для com-ошибок:
Немного непонятно, где тут ошибка?
Если ошибка выводится в поток StdOut, или отображается в диалоге, то обработчик её обнаружит.
 

Naisho

Знающий
Сообщения
86
Репутация
12
CreatoR сказал(а):
Немного непонятно, где тут ошибка?
Если ошибка выводится в поток StdOut, или отображается в диалоге, то обработчик её обнаружит.
В приведённом коде ошибки нет. Он используется для отлова com-ошибок и перевода их в нефатальные. В большинстве случаев всё работает как задумано - ошибки отлавливаются, основной скомпилированный скрипт работает. НО: иногда скрипт просто тихо закрывается без вывода стандартно окна краха Auto-it. Поскольку такая ситуация редкая, мне ни разу не удалось воспроизвести её в нескомпилированном скрипте - соответственно хочу попытаться отловить её методом из данной темы.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Naisho [?]
иногда скрипт просто тихо закрывается без вывода стандартно окна краха Auto-it
Значит где то произошла утечка памяти. Как указано в шапке, библиотека не поддерживает такие падения (т.к процесс завершается системой а не внутренним механизмом).
 
Верх