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("继续执行后续代码")
// 输出: 继续执行后续代码