使用 try...catch 语句包裹 webhid 的异步调用,即可捕获如设备断开或权限拒绝等错误。webhid 的 api(如 requestdevice()、open())均返回 promise,因此必须配合 async/await 语法或在 promise 链中使用 .catch() 来处理异常。

如何正确请求并打开 HID 设备
在初始化阶段,通过 navigator.hid.requestDevice() 获取设备列表,并使用 device.open() 建立连接。这两个步骤都可能抛出错误,例如用户取消选择或设备不支持特定协议。将调用放入 try...catch 块中,可以确保即使发生错误,程序也不会崩溃,而是进入错误处理逻辑。

const initHID = async () => {
try {
// 请求符合条件的设备
const devices = await navigator.hid.requestDevice({ filters: [{ usagePage: 0xFF00 }] });
if (devices.length === 0) return;
// 打开第一个选中的设备
const device = devices[0];
await device.open();
console.log('Device opened successfully');
// 监听断开事件
device.addEventListener('close', handleDeviceClose);
} catch (error) {
console.error('Failed to initialize HID:', error);
}
};
initHID();
运行上述代码后,如果用户选择了设备且连接成功,控制台将输出 'Device opened successfully'。如果用户取消选择或浏览器拒绝权限,控制台将输出 'Failed to initialize HID:' 及具体的错误对象。若设备在打开过程中被拔出,会触发 close 事件而非抛出同步异常。
如何在读写数据时捕获传输错误
在设备运行期间,使用 device.sendFeatureReport()、device.receiveReport() 或 device.sendOutputReport() 进行通信。这些方法同样返回 Promise,若设备突然断开或传输失败,会抛出 HIDServiceError。必须在每次 I/O 操作周围包裹错误处理逻辑,或者使用统一的错误处理函数来管理状态。

const readData = async (device) => {
try {
// 尝试接收报告
const reportId = await device.receiveReport();
console.log('Received report ID:', reportId);
} catch (error) {
if (error.name === 'HIDServiceError') {
console.warn('Device disconnected during read:', error.message);
// 在此处重置 UI 状态或提示用户重新连接
} else {
console.error('Unexpected error during read:', error);
}
}
};
当执行 readData 函数时,如果设备正常响应,控制台会打印接收到的报告 ID。如果设备在等待读取时被移除,receiveReport() 将抛出异常,代码将捕获该错误并打印 'Device disconnected during read'。这种处理方式确保了即使在异步通信中途发生硬件故障,应用也能优雅地降级而不是崩溃。
设备关闭事件如何处理以替代错误捕获
除了 try...catch 捕获 Promise 拒绝外,WebHID 还提供了 close 事件用于处理设备意外断开的情况。当设备被物理拔出或系统强制释放时,device.close() 会被自动调用,同时触发 close 事件。这与 try...catch 捕获的运行时错误不同,它是一种状态通知机制。开发者应注册 addEventListener('close', ...) 来清理资源或更新 UI,而不是依赖错误处理来感知断开。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











