之前我们借助讲解failure库,详细说明的Rust错误处理的哲学,这有助于我们理解今天的主题,anyhow和thiserror Anyhow提供了一个anyhow::Errortrait(有点类似failure::Error)。而得益于std::error::Error所做的修改,它anyhow::Error是与std::error::Error兼容的。也就是说,对于自定义的错误类型,只需要实现std::error::...
我们通常也需要在自己的代码中自定义错误,并且为之手动实现std::error::Error,这个工作很麻烦,所以就有了thiserror,自动帮我们生成实现的std::error::Error的代码。 而借助于anyhow::Error,和与之对应的Result<T, anyhow::Error>,等价于anyhow::Result<T>,我们可以使用?在可能失败的函数中传播任何实现了std::er...
thiserror 是一个用于生成枚举类型来表示错误的库。它允许你为错误定义自定义结构体,并在其中包含有关错误的有用信息。这使得错误处理更加清晰和易于理解。 anyhow 是一个通用的错误处理库,它使用 Result 类型来表示可能的错误。它不强制要求你为错误定义特定的结构体,而是提供了一种简单的方式来处理错误。 错误传播...
在选择适合的错误处理库时,本文探讨了选择thiserror或anyhow的依据。开发者可以通过了解两者的优缺点,在项目中做出合适的选择。❒ 库开发者需求 对于库的开发者而言,thiserror通过自动化特性简化错误类型定义。明确且易于理解的错误类型定义至关重要,而 thiserror 正是为此需求而生,它能自动实现必要的错误处理特性...
之前我们借助讲解failure库,详细说明的Rust错误处理的哲学,这有助于我们理解今天的主题,anyhow和thiserror Anyhow提供了一个anyhow::Errortrait(有点类似failure::Error)。而得益于std::error::Error所做的修改,它anyhow::Error是与std::error::Error兼容的。也就是说...
9.1 thiserror 库 9.2 anyhow库 9.3 thiserror 和 anyhow 的区别 参考 1 错误处理的主流方式 1.1 使用返回值 使用返回值来表示错误,如 C 语言和 Golang 例如,在 C 语言中,如果 fopen(filename) 无法打开文件,会返回 NULL,调用者通过判断返回值是否为 NULL,来进行相应的错误处理 缺点 在C 语言中,没区分开...
#[derive(Error, Debug)] #[error("my error {0}")] pub enum Error { Json(#[from] serde_json::Error), Yaml(#[from] serde_yaml::Error), #[error(transparent)] Other(#[from] anyhow::Error), } 快速上手 下面是简单的使用 thiserror 创建和处理自定义错误的示例: 1.确保在 Cargo.toml...
在开发可复用的库时,定义明确的错误类型至关重要。thiserror库通过派生宏简化了这一过程。以下是一个自定义错误类型的示例:Cargo.toml依赖配置:错误类型定义:应用示例:通过#[from]属性,Rust自动将底层错误(如std::io::Error)转换为自定义错误类型,与?无缝结合。对于应用程序或命令行工具,anyhow库提供了一种...
在上面的代码中,我们为 MyError 类型的错误分别实现了转换为登录后复制std::Error和登录后复制std::ParseIntError类型的 From Trait; 因此,在 read_file 函数中就可以直接使用登录后复制?向上返回错误了! 但是上面的方法需要为每个错误实现 From Trait 还是有些麻烦,因此出现了 thiserror 以及 anyhow 库来解决这些...
anyhow提供了downcast_ref方法,用于在运行时将anyhow::Error转换为其包含的具体错误类型的引用。这可以用于检查和处理特定类型的错误。 use anyhow::{anyhow,Error}; use thiserror::Error; #[derive(Error, Debug)] pub enum MyError { #[error("the data for key `{0}` is not available")] ...