实现std::error::Error的Trait,并根据error的级别决定是否覆盖source()方法.如果当前错误类型是低级别错误,没有子错误,则返回None,所以此时可以不覆盖soucre(); 如果当前错误有子错误,则需要覆盖该方法 动手实现一个Demo如下: use std::error::Error; // 自定义Error,通过#[derive(Debug)]注解实现std::fm...
一个像Box<dyn std::error::Error>的类型可以构建于任意的特定具体错误,可以通过Display打印输出,并且可以通过动态地向下转换进行可选的暴露。anyhow[5]就是这种风格的最佳示例。 std::io::Error的这种情况比较有趣,是因为它想同时做到以上两点甚至更多。 这是std,所以封装和面向未来是最重要的。 来自操作系统的 ...
一个像Box<dyn std::error::Error>的类型可以构建于任意的特定具体错误,可以通过Display打印输出,并且可以通过动态地向下转换进行可选的暴露。anyhow[5]就是这种风格的最佳示例。 std::io::Error的这种情况比较有趣,是因为它想同时做到以上两点甚至更多。 这是std,所以封装和面向未来是最重要的。 来自操作系统的 ...
一个像Box<dyn std::error::Error>的类型可以构建于任意的特定具体错误,可以通过Display打印输出,并且可以通过动态地向下转换进行可选的暴露。anyhow就是这种风格的最佳示例。 std::io::Error的这种情况比较有趣,是因为它想同时做到以上两点甚至更多。 这是std,所以封装和面向未来是最重要的。 来自操作系统的 I/O...
failure是rust-lang-nursery下的一个库,可以说是根正苗红的rust库了。其目标是取代基于std::eror::Error的错误处理。 failure有两个核心组件 Fail: 定制错误类型用的trait Error: 只要实现了Fail,就能转化为该结构体 Fail trait Fail trait被用来取代std::error::Error。它提供了backtrace和cause方法去获取错误的...
而得益于std::error::Error所做的修改,它anyhow::Error是与std::error::Error兼容的。也就是说,对于自定义的错误类型,只需要实现std::error::Error即可。这对于程序的兼容性是一大利好,也因此failure库被日渐废弃。而thiserror正是方便大家为自定义的错误使用宏实现std::...
thiserror通过以下方式改进了错误传播: 自动生成错误实现:thiserror自动为你的错误类型生成实现了std::error::Error和std::fmt::Displaytrait 的代码,这样你就不需要手动编写这些代码了。这可以减少代码重复,并提高代码的可读性和可维护性。 错误链:thiserror支持错误链,允许你在错误中包含有关错误来源的信息。这有助...
thiserror 是一个 Rust 库,用于简化错误处理。它可以帮助你为你的代码生成符合 std::error::Error trait 的错误类型。关于 thiserror 是否能兼容老旧代码,这取决于你的具体需求和代码结构。 如果你的老旧代码已经实现了 std::error::Error trait,那么你可以逐步引入 thiserror 来替换手动编写的错误处理代码。这样...
custom_error.rs: usestd::error::Error;usestd::fmt;usestd::fmt::Display;// 自定义错误类型,包含文件路径信息#[derive(Debug)]pubstructMyError{ msg:String, source:String, }// 为自定义错误类型实现Error traitimplErrorforMyError{}// 实现Display trait,以便于打印错误信息implfmt::DisplayforMyError{...
而得益于std::error::Error所做的修改,它anyhow::Error是与std::error::Error兼容的。也就是说,对于自定义的错误类型,只需要实现std::error::Error即可。这对于程序的兼容性是一大利好,也因此failure库被日渐废弃。而thiserror正是方便大家为自定义的错误使用宏实现std::error::Error而设计的。