在 javascript 中捕获 webusb 错误,最直接的方法是在 async 函数中使用 try...catch 语句包裹所有与设备交互的调用。由于 webusb api 的所有方法(如 open()、transferin())都返回 promise,任何底层通信失败或权限被拒都会导致 promise 拒绝,从而触发 catch 块。开发者只需确保在调用链的顶层或关键节点进行捕获,即可统一处理异常。

如何初始化并打开一个 WebUSB 设备
要成功连接设备,需要依次调用 navigator.usb.requestDevice() 筛选设备,然后调用 device.open() 建立连接。如果用户取消选择或设备不支持所需接口,这些步骤会抛出错误。

const filter = { vendorId: 0x5345, productId: 0x0123 };
async function connectDevice() {
try {
const device = await navigator.usb.requestDevice({ filters: [filter] });
await device.open();
console.log('Device opened successfully');
return device;
} catch (error) {
console.error('Failed to open device:', error.message);
}
}
connectDevice();
上述代码定义了设备过滤条件,并在 try 块中执行请求和打开操作。若用户未选择设备或 open() 失败,控制流将跳转至 catch 块,打印错误信息。预期结果是控制台输出 "Device opened successfully" 或在失败时输出错误详情。
如何处理设备断开连接或通信超时
WebUSB 设备在使用过程中可能意外断开,或者数据传输因超时失败。此时应检查 error.name 属性,区分 NotFoundError、InvalidStateError 等具体类型,以便采取不同恢复策略。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

async function readData(device) {
try {
// 假设端点 1 用于接收数据
const result = await device.transferIn(1, 64);
console.log('Received data:', result.data);
} catch (error) {
if (error.name === 'NotFoundError') {
console.warn('Device disconnected during transfer.');
} else if (error.name === 'InvalidStateError') {
console.warn('Device is not connected or interface is closed.');
} else {
console.error('Transfer failed:', error.message);
}
}
}
// 假设 device 已在前一步获取
if (device) {
readData(device);
}
该代码演示了如何在读取数据时处理特定错误。通过判断 error.name,可以识别设备是否断开(NotFoundError)或状态无效(InvalidStateError)。这有助于程序在遇到硬件问题时做出适当响应,而不是简单崩溃。
当 WebUSB 权限被浏览器拒绝时会发生什么
如果用户未在弹出窗口中授权,或浏览器策略禁止访问,requestDevice() 将抛出一个 SecurityError 或 NotAllowedError。此时 catch 块会捕获该异常,程序不会继续执行后续的设备操作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










