Что нового

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AutoIt: 3.3.12.0, 3.3.9.4, 3.3.8.X, 3.3.6.X
Версия: 0.1

Категория: Вспомогательные функции, Разное

Описание: Позволяет установить обработчик критических ошибок в AutoIt скрипте.

Особенности, ограничения, и отличия от других похожих обработчиков (в том числе и от моего OnAutoItErrorRegister):
[Особенности]
[*]Не используется Hook & StdOut.
[*]Продолжение выполнения скрипта даже после критической ошибки.

[Ограничения]
[*]На данный момент, работает только в скомпилированном скрипте.
[*]На данный момент поддерживает только AutoIt 3.3.12.0 / 3.3.9.4 / 3.3.8.X / 3.3.6.X.
[*]Ошибки вызванные утечкой памяти (жёсткое падение и рекурсия) не поддерживаются.


Примечания:
[*]Используйте предоставленный инструмент GetErrLineCode.au3 для получения корректной строки кода с ошибкой по номеру строки полученной от сообщения об ошибке из скомпилированного скрипта.



Пример №1:
Код:
#NoTrayIcon

#include <GUIConstantsEx.au3>
#include 'AutoItErrorHandler.au3'

If Not _OnAutoItErrorRegister('', '', 'My App Error') Then
	Switch @error
		Case -1
			;If Not @Compiled Then
				MsgBox(48, @ScriptName, 'ATM, only compiled script is supported, please compile the script.')
			;EndIf
		Case 1
			;If Not StringRegExp(@AutoItVersion, '^3\.3\.(12\.0|9\.4|8\.\d+|6\.\d+)$') Then
				MsgBox(48, @ScriptName, 'ATM, only these AutoIt versions are supported:' & @CRLF & '3.3.12.0 / 3.3.9.4 / 3.3.8.X / 3.3.6.X')
			;EndIf
	EndSwitch
	
	Exit
EndIf

GUICreate('AutoItErrorHandler Example', 350, 200)

GUICtrlCreateLabel('This script is just an example.' & @LF & @LF & '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 Firex & G.Sandler © 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


Пример №2:
Код:
#NoTrayIcon

#include <Constants.au3>
#include 'AutoItErrorHandler.au3'

If Not _OnAutoItErrorRegister('_MyErrorHandler') Then
	Switch @error
		Case -1
			;If Not @Compiled Then
				MsgBox(48, @ScriptName, 'ATM, only compiled script is supported, please compile the script.')
			;EndIf
		Case 1
			;If Not StringRegExp(@AutoItVersion, '^3\.3\.(12\.0|9\.4|8\.\d+|6\.\d+)$') Then
				MsgBox(48, @ScriptName, 'ATM, only these AutoIt versions are supported:' & @CRLF & '3.3.12.0 / 3.3.9.4 / 3.3.8.X / 3.3.6.X')
			;EndIf
	EndSwitch
	
	Exit
EndIf

;We deliberately make an array bounding error and call the error!
Dim $aArr[1]
MsgBox(0, '', $aArr[1])

MsgBox(64, @ScriptName, 'We can continue!!!' & @CRLF & 'Now we set other AutoIt Error Handler (default error msg handler), and trigger some error...')
_OnAutoItErrorRegister('')

$aArr[3] = $aArr

Func _MyErrorHandler($sScriptPath, $iScriptLine, $sErrDesc, $vParams, $hBitmap)
	Local $sMessage = StringFormat('SCRIPT FILE:\n%s\n\nSCRIPT ERROR LINE:\n%s\n\nERROR DESCRIPTION:\n%s', $sScriptPath, $iScriptLine, $sErrDesc)
	
	If FileExists(@WindowsDir & '\Media\chord.wav') Then
		SoundPlay(@WindowsDir & '\Media\chord.wav')
	Else
		DllCall('user32.dll', 'int', 'MessageBeep', 'int', 0x00000010)
	EndIf
	
	If MsgBox(BitOR($MB_SYSTEMMODAL, $MB_YESNO), 'Crash recieved!', 'Restart application?' & @CRLF & '(if you press "No", the script will continue from next line)' & @CRLF & @CRLF & $sMessage) <> 6 Then
		Return $iAEH_CONTINUE_PROC
	EndIf
	
	Local $sRunLine = @AutoItExe & ' "' & @ScriptFullPath & '"'
	
	If @Compiled Then
		$sRunLine = @ScriptFullPath
	EndIf
	
	Run($sRunLine, @ScriptDir)
	Return $iAEH_TERMINATE_PROC
EndFunc

Файл: AutoItErrorHandler.zip (Скачиваний:
AutoItErrorHandler.zip_CntrImg.png
)

Снимок:


История версий:
v0.1
* Первая публичная версия

Источник: autoit-script.ru
Автор(ы): G.Sandler (CreatoR), основной движок взят из библиотеки SEH от firex.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Полезная UDF, но хотелось бы обработчик не только ошибок AutoIt, но так же обработчик вылетов и зависаний. ;)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
inververs [?]
хотелось бы обработчик не только ошибок AutoIt, но так же обработчик вылетов и зависаний
Вылеты вызванные утечкой памяти отловить не получится, [?] "т.к процесс завершается системой а не внутренним механизмом".

Для отлова зависании можно попробовать скрестить библиотеку с OnHungApp.
 
Верх