跳到主要内容

try...catch 异常处理

  • 可以防止突然报错,引起脚本停止或崩溃
  • 对性能有5-15%的影响,非必要不要使用,以修复代码问题为主

语法结构

  • try 包裹可能抛出错误的代码块。若发生错误,后续代码立即终止
  • catch 接收错误对象(如 error)
  • finally 无论是否出错都会执行,常用于清理资源(如关闭文件、释放内存)
  • throw 语句,主动抛出自定义异常
try{
// 可能出错的代码
logd(1)
logd(a)
logd(2)
}catch (error) {
// 报错后处理的代码
loge(error)
}finally {
logd("不管错不错都要最后执行的代码")
}

// 输出: 1
// 输出: ReferenceError: “a” 未定义。
// 输出: 不管错不错都要最后执行的代码

常用

  • 一般finally用不到
  • error只是个变量名,可以随便定义
try{
logd(1)
logd(a)
logd(2)
}catch (e) {
// 报错后处理的代码,也可以不写,一般会打印一下e的内容,方便知道出了什么错
loge(e)
}
logd("继续执行后续代码")

// 输出: 1
// 输出: ReferenceError: “a” 未定义。
// 输出: 继续执行后续代码

throw

  • 主动抛出异常,在一些特定场景有用
try {
logd(1)
throw "主动抛出异常Error"
logd(2)
} catch (e) {
// 报错后处理的代码,也可以不写,一般会打印一下e的内容,方便知道出了什么错
loge(e)
}
logd("继续执行后续代码")

// 输出: 1
// 输出: 主动抛出异常Error
// 输出: 继续执行后续代码

建议

  • 尽量避免使用try...catch,非必要不要使用,以修复代码问题为主
  • 如EasyClick中,查找节点或图片时,如果找不到,经常会报错,并引起脚本停止和崩溃
let node = text("节点").getOneNodeInfo(0)
node.click()
logd("执行后续代码")

// 输出: TypeError: 无法调用 null 的方法 “click”
// 脚本停止运行
  • 此时可以用try...catch偷懒
try{
let node = text("节点").getOneNodeInfo(0)
node.click()
}catch (e) {

}
logd("继续执行后续代码")

// 输出: 继续执行后续代码
  • 但更推荐严谨的写法,自己判断返回值
let node = text("节点").getOneNodeInfo(0)
if(node){
node.click()
}
logd("继续执行后续代码")

// 输出: 继续执行后续代码