Skip to content

优化 USB 接收回调中的错误处理:替换 std::terminate() 为优雅的错误标志机制 #13

@coderabbitai

Description

@coderabbitai

问题描述

host/src/transport/usb.cppusb_receive_complete_callback() 函数中(约第 435-437 行),当设备断开连接或重新提交传输失败时,当前实现直接调用 std::terminate() 导致进程崩溃。

设备断开是正常的外设操作事件,不应导致整个 SDK 进程终止,这会严重影响 SDK 的使用体验。

当前实现

int ret = libusb_submit_transfer(transfer);
if (ret != 0) [[unlikely]] {
    if (ret == LIBUSB_ERROR_NO_DEVICE)
        logger_.error("Failed to re-submit receive transfer: Device disconnected. Terminating...");
    else
        logger_.error("Failed to re-submit receive transfer: {} ({}). Terminating...", ret, libusb_errname(ret));
    destroy_libusb_transfer(transfer);
    
    // TODO: Replace abrupt termination with a flag and exception-based error handling
    std::terminate();
}

期望的改进

参考同文件中其他地方已使用的错误处理模式(如 stop_handling_events_ 标志),应该:

  1. 设置错误标志 stop_handling_events_ = true
  2. 记录适当的错误状态(例如设置 last_error_usb_error_ 成员变量,包含描述性的错误代码/消息)
  3. 确保函数干净地返回,让上层能够检测标志并处理设备断开/重提交失败事件
  4. 不要终止进程或吞掉错误——通过现有的事件循环/条件变量或围绕 stop_handling_events_ 的状态检查路径传播错误状态

相关链接

优先级

当前实现可以接受,但应在后续版本中优化以提供更好的错误处理和用户体验。

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

Status

Todo

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions