#error #anyhow #serde #failure

serde-error

Serde (反)序列化错误类型

3个版本

0.1.2 2021年1月11日
0.1.1 2021年1月11日
0.1.0 2021年1月10日

#462 in 调试

Download history 6817/week @ 2024-03-25 7769/week @ 2024-04-01 6374/week @ 2024-04-08 7262/week @ 2024-04-15 8844/week @ 2024-04-22 5739/week @ 2024-04-29 6947/week @ 2024-05-06 7005/week @ 2024-05-13 5776/week @ 2024-05-20 3309/week @ 2024-05-27 4175/week @ 2024-06-03 2836/week @ 2024-06-10 3661/week @ 2024-06-17 3163/week @ 2024-06-24 4193/week @ 2024-07-01 3732/week @ 2024-07-08

14,998每月下载量
用于 32 个crate (4个直接使用)

MIT 许可证

7KB

serde-error

serde-error 提供一个可(反)序列化的 Error 类型,实现了 std::error::Error,可以轻松用于通过网络传输错误。

我应该使用这个吗?

这个crate是生产级别的。然而,你可能不想使用它:通常,将错误作为某种类型汇总,而不是序列化整个因果关系链,更有意义。

这个crate被设计用于在Rust WebAssembly blob中运行Rust wasmtime-host。在这种情况下,因果关系链在序列化边界上被清晰地保留,因此保留所有内容是有意义的。

在其他一些情况下,可能有必要序列化整个因果关系链,但通常最合理的是不要序列化错误。

因此,请节俭地使用 serde-error

如何使用这个?

use anyhow::Context;
use std::error::Error;

fn foo() -> anyhow::Result<()> {
    // ...
    Err(anyhow::anyhow!("Failed smurfing the smurfs"))
}

fn bar() -> anyhow::Result<()> {
    // ...
    foo().context("Running foo")
}

fn main() {
    if let Err(returned_err) = bar() {
        let s = bincode::serialize(&serde_error::Error::new(&*returned_err))
            .expect("Serializing error");
        let d: serde_error::Error = bincode::deserialize(&s)
            .expect("Deserializing error");
        let e = anyhow::Error::from(d);
        assert_eq!(e.to_string(), "Running foo");
        assert_eq!(e.source().unwrap().to_string(), "Failed smurfing the smurfs");
    } else {
        panic!("bar did not return an error");
    }
}

依赖项

~0.4–1MB
~24K SLoC