一个像Box<dyn std::error::Error>的类型可以构建于任意的特定具体错误,可以通过Display打印输出,并且可以通过动态地向下转换进行可选的暴露。anyhow[5]就是这种风格的最佳示例。 std::io::Error的这种情况比较有趣,是因为它想同时做到以上两点甚至更多。 这是std,所以封装和面向未来是最重要的。 来自操作系统的 ...
custom_error.rs: usestd::error::Error;usestd::fmt;usestd::fmt::Display;// 自定义错误类型,包含文件路径信息#[derive(Debug)]pubstructMyError{ msg:String, source:String, }// 为自定义错误类型实现Error traitimplErrorforMyError{}// 实现Display trait,以便于打印错误信息implfmt::DisplayforMyError{...
}fndo_something() - >Result< (), MyError > {Err(MyError { message:String::from("Something went wrong!"), }) } 在上面的代码中,我们定义了一个MyError结构体来表示我们的自定义错误类型。该结构体实现了std::error::Errortrait 和std::fmt::Displaytrait。std::error::Errortrait 定义了一些关于...
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,...
而得益于std::error::Error所做的修改,它anyhow::Error是与std::error::Error兼容的。也就是说,对于自定义的错误类型,只需要实现std::error::Error即可。这对于程序的兼容性是一大利好,也因此failure库被日渐废弃。而thiserror正是方便大家为自定义的错误使用宏实现std::error::Error而设计的。
use std::fs::File;use std::io::Read;fn read_file(path: &str) -> Result<String, std::io::Error> { let mut file = File::open(path)?; let mut contents = String::new(); file.read_to_string(&mut contents)?; Ok(contents)}1.2.3.4.5.6.7.8.9.read_file函数读取...
failure是rust-lang-nursery下的一个库,可以说是根正苗红的rust库了。其目标是取代基于std::eror::Error的错误处理。 failure有两个核心组件 Fail: 定制错误类型用的trait Error: 只要实现了Fail,就能转化为该结构体 Fail trait Fail trait被用来取代std::error::Error。它提供了backtrace和cause方法去获取错误的...
目前为止,我们将所有的输出都println!到了终端。大部分终端都提供了两种输出:标准输出(standard output,stdout)对应通用信息,标准错误(standard error,stderr)则用于错误信息。这种区别允许用户选择将程序正常输出定向到一个文件中并仍将错误信息打印到屏幕上。
implError{pubfnfrom_raw_os_error(code:i32)->Error{Error{repr:Repr::Os(code)}}pubfnraw_os_error(&self)->Option<i32>{matchself.repr{Repr::Os(i)=>Some(i),Repr::Custom(..)=>None,Repr::Simple(..)=>None,}}} 特定平台的sys::decode_error_kind函数负责把错误代码映射到ErrorKind枚举。所...
; 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::...