一个像Box<dyn std::error::Error>的类型可以构建于任意的特定具体错误,可以通过Display打印输出,并且可以通过动态地向下转换进行可选的暴露。anyhow[5]就是这种风格的最佳示例。 std::io::Error的这种情况比较有趣,是因为它想同时做到以上两点甚至更多。 这是std,所以封装和面向未来是最重要的。 来自操作系统的
thiserror库通常会与anyhow一起使用,以方便地构建结构化的自定义错误类型。下面是一个例子: #[derive(Debug, thiserror::Error)] enum CustomError { #[error("File I/O error: {0}")] Io(#[from] std::io::Error), #[error("Parsing error in file")] ParsingFailure, #[error("Configuration ...
custom_error.rs: usestd::error::Error;usestd::fmt;usestd::fmt::Display;// 自定义错误类型,包含文件路径信息#[derive(Debug)]pubstructMyError{ msg:String, source:String, }// 为自定义错误类型实现Error traitimplErrorforMyError{}// 实现Display trait,以便于打印错误信息implfmt::DisplayforMyError{...
; Ok(()) } #[derive(Debug)] enum UnExpectedError { Io(std::io::Error) } struct DesignError { ov: i32, nv: i32, } // 实现Error trait表明UnExpectedError是个错误类型 // 而错误类型通过Debug和Display来描述它们自己,所以UnExpectedError又实现了这两个trait。 impl std::error::...
use std::io::Error;fnmain(){letpath="/tmp/dat";//文件路径matchread_file(path){//判断方法结果Ok(file)=>{println!("{}",file)}//OK 代表读取到文件内容,正确打印文件内容Err(e)=>{println!("{} {}",path,e)}//Err代表结果不存在,打印错误结果}}fnread_file(path:&str)->Result<String,...
usestd::error::Error;usestd::fmt;#[derive(Debug)]structMyError{ message:String, }implErrorforMyError {}implfmt::DisplayforMyError {fnfmt(&self, f: &mutfmt::Formatter) - > fmt::Result{write!(f,"{}",self.message) } }fnmain() - >Result< (), MyError > {letresult = do_somethin...
而得益于std::error::Error所做的修改,它anyhow::Error是与std::error::Error兼容的。也就是说,对于自定义的错误类型,只需要实现std::error::Error即可。这对于程序的兼容性是一大利好,也因此failure库被日渐废弃。而thiserror正是方便大家为自定义的错误使用宏实现std::error::Error而设计的。
failure是rust-lang-nursery下的一个库,可以说是根正苗红的rust库了。其目标是取代基于std::eror::Error的错误处理。 failure有两个核心组件 Fail: 定制错误类型用的trait Error: 只要实现了Fail,就能转化为该结构体 Fail trait Fail trait被用来取代std::error::Error。它提供了backtrace和cause方法去获取错误的...
std::result:: result <T, E>类型是一个泛型Result类型,可以用来表示任何错误。 每种错误类型都有各自的一组方法和特征,用于以特定的方式来处理它。 下面是Rust中文件读取操作的错误处理示例: use std::fs::File; use std::io::Read; fn read_file(path: &str) -> Result<String, std::io::Error> ...
usestd::fs::File;fnmain(){letgreeting_file_result=File::open("hello.txt");} File::open 的返回值是 Result<T, E>。泛型参数 T 会被 File::open 的实现放入成功返回值的类型 std::fs::File,这是一个文件句柄。错误返回值使用的 E 的类型是 std::io::Error。这些返回类型意味着 File::open 调...