【发布时间】:2015-12-05 18:26:50
【问题描述】:
我的 AutoIt 脚本会发送一个点击和按键列表来自动化一个旧的闭源应用程序。
它有错误,所以我想知道如何调试 AutoIt 脚本。或者至少输出脚本的行号(以显示实时执行的代码)。
【问题讨论】:
我的 AutoIt 脚本会发送一个点击和按键列表来自动化一个旧的闭源应用程序。
它有错误,所以我想知道如何调试 AutoIt 脚本。或者至少输出脚本的行号(以显示实时执行的代码)。
【问题讨论】:
如何调试 AutoIt 代码?
根据Documentation - Intro - AutoIt Syntax Checker (Au3Check):
检查脚本的语法错误。
例子:
#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7
在执行和编译之前报告(几乎)每个非运行时错误。
…告诉我哪些代码是实时执行的…
根据Documentation - Function Reference - AutoItSetOption():
TrayIconDebug如果启用,则在托盘图标提示中显示当前脚本行以帮助调试。
例子:
AutoItSetOption("TrayIconDebug", 1)
#AutoIt3Wrapper_Run_Debug_Mode=Y 运行带有控制台调试的脚本。
由于前置包含文件,已编译脚本的行号(在错误消息中)与原始 .au3 文件不匹配。根据Documentation - SciTE4AutoIt3 - Au3Stripper:
如果没有错误,运行 Au3Stripper 以在包含所有源(脚本和任何#include 文件)的同一文件夹中创建一个剥离的源文件 Scriptname_Stripped
例子:
#AutoIt3Wrapper_Run_Au3Stripper=y
编译脚本的错误消息中的行号现在与scriptname_stripped.au3 中的行号匹配(编译后出现)。
ConsoleWrite()。如果要从已编译的脚本中读取,请添加 #AutoIt3Wrapper_Change2CUI=y。
@error、@extended 和 @ScriptLineNumber
SciTE4AutoIt3 > Tools > Trace: Add Trace Lines 为每一行插入这样一个命令。显示当前的@error 代码(以及相关行)。SciTE4AutoIt3 > Tools > Debug to Console (Alt + D) 为当前选定的行插入这样的命令。显示@ScriptLineNumber、返回值和@error 代码。再次执行原始行以获取其返回值(可能不需要)。VarGetType() 返回the internal type representation of a variant。_ArrayDisplay() 查看数组变量的结构和内容。根据Documentation - User Defined Function Reference - _Assert():
断言失败时显示消息
Related。用于回归测试和验证边缘情况和假设(或在意外情况下简单地中止)。相关功能包括:
IsBinary()IsBool()IsDllStruct()IsFloat()IsHWnd()IsInt()IsNumber()IsPtr()IsString()IsDeclared()IsFunc()IsKeyWord()FileExists()通常函数返回return value 或-error code 之一(或两者的组合)。非0 错误代码值(有时为负)表示失败。返回值(如果这样使用)在0(失败)和1(成功)之间交替。
处理出现的错误。为正确的错误处理提供脚本自己调试。避免逐步嵌套If -statements。示例:
Global Enum $RANDOM_FLT, _
$RANDOM_INT
Global Enum $ERROR_OK, _
$ERROR_AIR, _
$ERROR_WATER, _
$ERROR_FOOD, _
$ERROR_ENUM
Global $g_aError[$ERROR_ENUM]
$g_aError[$ERROR_OK] = 'survived'
$g_aError[$ERROR_AIR] = 'no air'
$g_aError[$ERROR_WATER] = 'no water'
$g_aError[$ERROR_FOOD] = 'no food'
Global Const $g_sMsgConsole = 'error:%i - %s\n'
While True
Live()
If @error Then
ConsoleWrite(StringFormat($g_sMsgConsole, @error, $g_aError[@error])); And one of following:
ContinueLoop
; ExitLoop
; Return; If in Local scope.
; Exit @error
EndIf
; Continuation conditional to successful execution of Live():
ConsoleWrite(StringFormat($g_sMsgConsole, @error, $g_aError[@error]))
WEnd
Func Live()
Local Const $iError = Random($ERROR_OK, $ERROR_ENUM - 1, $RANDOM_INT), _
$iExtended = 0, _
$iReturn = $iError ? 0 : 1
Return SetError($iError, $iExtended, $iReturn)
EndFunc
Live()
Switch @error
Case $ERROR_AIR
; Handle specific error here.
Case $ERROR_WATER
; Handle specific error here.
Case $ERROR_FOOD
; Handle specific error here.
EndSwitch
返回值启用如下结构:
If Not SomeFunction() Then
; Handle here.
EndIf
; Continuation of script here.
将错误代码与短信相关联可能会有所帮助。如果在相互调用的多个相关函数之间共享时特别有用,这些函数透明地返回遇到的错误代码(例如,一些 FindOnPage() 从 LoadPage() 依赖项返回 $ERR_PAGELOAD)。
【讨论】:
在 SciTE 的工具中选择“Trace: Add trace lines”。如果未选择任何内容,这将向每一行添加一个 ConsoleWrite。如果您先选择一些代码,它将向您选择的内容添加 ConsoleWrite 行。
如果您在编译的代码中遇到错误,您可以在编译之前将其添加到脚本的顶部。当它出错时,它会在您的脚本中为您提供正确的行号。
#Au3Stripper_Parameters=/mo
【讨论】: