如何使用 try catch语法
events.observeKey();
// 拦截音量上键(避免系统弹出音量调节框)
events.setKeyInterceptionEnabled('volume_up', true);
// 监听音量上键按下事件
events.onKeyDown('volume_up', function() {
log('检测到音量加键按下,脚本即将停止');
exit(); // 立即停止脚本执行
});
监听到电源键就停止脚本并且贯穿脚本始终
// 开始监听物理按键
events.observeKey();
// 拦截音量上键(避免系统弹出音量调节框)
events.setKeyInterceptionEnabled('volume_up', true);
// 监听音量上键按下事件
events.onKeyDown('volume_up', function() {
log('检测到音量加键按下,脚本即将停止');
exit(); // 立即停止脚本执行
});
无法停止脚本,重新给一个方法
回答
在Hamibot中,你可以使用标准的JavaScript try-catch语法来处理异常。Hamibot使用的Rhino 1.7.15引擎支持基本的错误处理结构,但不支持箭头函数等现代特性。
// 文档地址 https://docs.hamibot.com/
基本语法:
try {
// 可能会出错的代码
} catch (error) {
// 处理错误
console.error("发生错误: " + error.message);
} finally {
// 无论是否出错都会执行的代码(可选)
}
具体使用示例:
- 处理UI操作可能发生的异常
try {
// 尝试点击某个元素,可能因为元素不存在而失败
id("com.example:id/button").findOne().click();
} catch (error) {
console.error("点击失败: " + error.message);
// 可以在这里执行备用方案
}
- 处理需要特定Android版本的功能
try {
requiresApi(24); // 需要Android 7.0以上
// 只有在满足API级别时才会执行的代码
console.log("当前系统版本满足要求");
} catch (error) {
console.log("系统版本太低,无法执行此功能");
// 可以选择退出脚本或使用替代方案
hamibot.exit();
}
- 特别注意:关于hamibot.exit()的异常处理
根据Hamibot文档,hamibot.exit()是通过抛出ScriptInterrupttedException实现的。如果你在try-catch中捕获了这个异常,脚本不会立即停止:
try {
hamibot.exit(); // 试图停止脚本
} catch (error) {
console.log("exit()的异常被捕获了");
// 脚本不会立即停止,会继续执行后面的代码
}
console.log("这段代码仍会执行");
- 最佳实践:记录详细错误信息
try {
// 复杂操作
waitForPackage("com.example.app");
id("button_id").findOne(2000).click();
} catch (error) {
console.error("错误详情:");
console.error("错误类型: " + error.name);
console.error("错误信息: " + error.message);
console.error("堆栈信息: " + error.stack);
// 发送错误报告
hamibot.postMessage({
type: "error",
message: error.message,
stack: error.stack
});
}
记住,良好的错误处理能提高脚本的稳定性和可靠性,特别是在处理UI自动化时,因为界面元素可能随时变化或不可用。
补充回答 1
要监听电源键并在检测到按下时停止脚本,你需要修改按键名称为'power'并确保正确设置按键屏蔽。以下是完整实现代码:
// 文档地址 https://docs.hamibot.com/
events.observeKey();
// 拦截电源键(避免系统弹出锁屏或关机菜单)
events.setKeyInterceptionEnabled('power', true);
// 监听电源键按下事件
events.onKeyDown('power', function() {
log('检测到电源键按下,脚本即将停止');
exit(); // 立即停止脚本执行
});
这个脚本会:
- 启用按键监听功能(需要无障碍服务已开启)
- 屏蔽电源键的默认系统行为(防止弹出锁屏/关机菜单)
- 持续监听电源键按下事件,一旦检测到按下就记录日志并终止脚本
注意:
- 该功能需要安卓4.3以上系统
- 必须启用Hamibot的无障碍服务才能正常工作
- 脚本退出时会自动解除按键屏蔽
- 电源键的按键名称在Hamibot中固定为'power'
这个监听会贯穿脚本整个生命周期,只要脚本在运行就能响应电源键事件。当用户按下电源键时,脚本会立即停止执行,不会触发系统的锁屏或关机操作。
补充回答 2
// 文档地址 https://docs.hamibot.com/
// 增强版物理按键停止脚本(兼容性更好)
// 确保无障碍服务已启用
auto.waitFor();
// 启用按键监听(必须放在最前面)
events.observeKey();
// 设置按键拦截(必须在监听前设置)
events.setKeyInterceptionEnabled('volume_up', true);
events.setKeyInterceptionEnabled('volume_down', true);
// 添加初始化确认日志
log('✅ 按键监听已启动,音量键已屏蔽');
// 实现更可靠的停止机制
function stopScript() {
log('🛑 检测到停止按键,正在终止脚本...');
// 尝试多种停止方式确保生效
try {
engines.myEngine().forceStop();
} catch (e) {
exit();
}
}
// 监听音量上键(主停止键)
events.onKeyDown('volume_up', function(event) {
log('🔼 检测到音量上键按下');
stopScript();
});
// 监听音量下键(备用停止键)
events.onKeyDown('volume_down', function(event) {
log('🔽 检测到音量下键按下');
stopScript();
});
// 添加错误处理确保监听持续有效
events.on('error', function(e) {
log('⚠️ 按键监听错误: ' + e);
// 出错后尝试重新启用监听
try {
events.observeKey();
} catch (reconnectErr) {
log('❌ 无法恢复按键监听: ' + reconnectErr);
}
});
// 添加脚本生命周期确认
events.on('exit', function() {
log('⏹️ 脚本已成功终止');
// 确保解除按键屏蔽
events.setKeyInterceptionEnabled(false);
});
// 添加持续运行标识
setInterval(function() {
// 保持脚本活跃状态
}, 60000);
log('⏳ 脚本持续运行中,按下音量键可停止');
这个改进版方案:
- 首先确保无障碍服务已启用(auto.waitFor())
- 采用双重停止机制(engines.myEngine().forceStop() + exit())
- 同时监听音量上下键作为主备停止键
- 添加了错误处理和自动恢复机制
- 设置了脚本生命周期确认
- 使用setInterval保持脚本活跃状态
如果仍然无法停止,请检查:
- 是否已授予Hamibot无障碍服务权限
- 设备是否有厂商定制系统限制(如小米的MIUI、华为的EMUI可能需要额外设置)
- 尝试重启Hamibot服务后再运行脚本