Skip to main content
每一个可能失败的调用都返回 lager::Result<T>,它是 std::result::Result<T, lager::Error> 的别名。
Error 带有 #[non_exhaustive],因此对它做 match 需要一个兜底分支,而新增变体不会破坏您的构建。

变体

变体参考

Connection(String)

该 crate 根本没有连上 Box。这个变体也涵盖 Socket.IO 连接失败。

Timeout(String)

客户端侧的截止时间到了:HTTP 请求、流式会话的连接确认,或者一直没等到的 wait_for 目标。
硬件等待超时不是这个变体。wait_for_level 在 Box 上超时,返回的是 Error::Box、HTTP 502 和 GPIO 'gpio24' did not reach level 1 within 2.0s,因为 Box 完成了请求并报告了结果。Error::Timeout 表示传输层放弃了。

Box { status: u16, message: String }

Box 接受了请求,并报告了一次失败。这是您最常见到的变体,其中的 message 是 Box 自己的文本。
常见形态: 路由器 Net 的”未找到”信息是 Net 'router1' not found,不带角色,因为路由器 Net 有意不发送角色提示。 Box 也可能用 HTTP 200success: false 来报告失败 —— 跨角色的仪器冲突就是这样。那仍然是 Error::Box

UnsupportedByBox { message }

该端点在 API 中是存在的,但这台 Box 太旧,提供不了它。信息中会指明所需的版本。
例如:usb_devices()dfu() 需要 Box 0.33.0;安全限值和交互式 RTT 需要 0.35.0;UsbPort::state() 需要 0.29.0。

NotSupportedByBox { feature, details }

该 crate 在任何 Box 上都没有这个功能的路由。目前只有 Scope 属于这种情况。
UnsupportedByBoxNotSupportedByBox 是两个不同的变体,名字却容易混淆。Unsupported 的意思是请更新 BoxNot supported 的意思是目前没有任何 Box 能做这件事

Decode(String)

该 crate 没能把响应解析成预期的结构。原因可能是响应体被截断、字段类型出乎意料,或者缺少必填字段。

AuthRequired { box_host, auth_url, message }

Box 受网关保护,而且没有可用的凭据。
请参阅 认证

Config(String)

客户端侧的问题,在发送任何内容之前就被发现:LAGER_BOX_HOST 未设置、主机地址无法解析、无法推断类型的固件路径,或者读不了的文件。

Stream(String)

UART 或 RTT 会话失败:该 Net 已被另一个会话占用、设备消失,或者会话意外关闭。

匹配

在旧 Box 上跳过测试

说明

  • Error 实现了 std::error::ErrorDisplay,因此 ? 可以直接转换到 Box<dyn Error>anyhow::Error,不需要额外转换。
  • From<serde_json::Error> 映射到 Error::Decode
  • 这些信息是写给在 CI 输出里阅读的人看的。请把错误本身打印出来,而不是只打印它的变体名。