这篇根据两个 H 版报错处理示例整理。一个重点是 #WarnContinuableException,另一个重点是用 OnError() 接住运行时错误,把错误保存到日志文件。前者是 H 版里的提示开关,后者才是日常脚本更常用的兜底处理。

不要只靠关闭提示

#WarnContinuableException Off 可以让某些可继续异常不再弹出 H 版警告,但它不是“修复错误”。如果脚本里有变量名错误、调用不存在函数、文件不存在、窗口权限不够,仍然应该用明确的异常处理和日志记录去排查。

#Requires AutoHotkey v1.1
#NoEnv
#WarnContinuableException Off
SetWorkingDir, %A_ScriptDir%

OnError("LogError")

F1::
    ; 测试:故意制造一个错误,观察 ErrorLog.txt
    throw Exception("测试错误:检查日志写入")
Return

Esc::ExitApp

LogError(exception) {
    logFile := A_ScriptDir "\ErrorLog.txt"
    text := "----- " A_Now " -----" Chr(10)
        . "Line: " exception.Line Chr(10)
        . "Message: " exception.Message Chr(10)
        . "What: " exception.What Chr(10)
        . "Extra: " exception.Extra Chr(10)
        . "File: " exception.File Chr(10) Chr(10)

    FileAppend, %text%, %logFile%, UTF-8
    MsgBox, 0x40010, 程序运行时出错, % "错误已写入:" logFile
    ExitApp
}

Try/Catch 处理局部错误

OnError() 适合做兜底,但它不应该替代局部判断。像运行外部程序、读取配置文件、连接 COM 对象这种明确可能失败的动作,建议在现场用 Try/Catch 处理。

Try Run, % A_ScriptDir "\not-exist.exe"
Catch e {
    MsgBox, % "运行程序失败:" e.Message
    ; 这里可以改成提示用户重新选择路径,或者写入普通日志
}

日志里要记录什么

  • exception.Line:出错行号,排查最快。
  • exception.Message:错误消息。
  • exception.What:正在执行的命令或函数。
  • exception.Extra:额外信息,有时为空。
  • exception.File:出错脚本文件路径。

实战建议

  • 日志路径优先用 A_ScriptDirA_Temp,不要写死个人桌面路径。
  • 调试阶段可以弹 MsgBox,正式工具更适合静默写日志,再给用户一个简短提示。
  • #ErrorStdOut 对控制台/外部捕获有用,但桌面脚本主要还是靠 OnError() 和自己的日志函数。
  • 不要为了“看起来不报错”而关掉所有提示。能定位的错误,最好让日志足够详细。
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。