一个像Box<dyn std::error::Error>的类型可以构建于任意的特定具体错误,可以通过Display打印输出,并且可以通过动态地向下转换进行可选的暴露。anyhow[5]就是这种风格的最佳示例。 std::io::Error的这种情况比较有趣,是因为它想同时做到以上两点甚至更多。 这是std,所以封装和面向未来是最重要的。 来自操作系统的 ...
use std::error::Error; // 自定义Error,通过#[derive(Debug)]注解实现std::fmt::Debug的trait #[derive(Debug)] struct CustomError { err: ChildError, } // 实现Display的trait impl std::fmt::Display for CustomError { // 一般情况下是固定写法 fn fmt(&self, f: &mut std::fmt:...
关于Rust中的OsString类型没有实现StdError特性,这意味着OsString类型无法直接用作错误类型。StdError特性定义了错误类型的方法,这些方法使得处理和传播错误变得更加方便。一般来说,当处理来自操作系统或其他库的错误时,StdError特性非常有用。 然而,在某些情况下,OsString类型可能不需要实现StdError特性,因为它主要用于表...
一个像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{...
目前为止,我们将所有的输出都println!到了终端。大部分终端都提供了两种输出:标准输出(standard output,stdout)对应通用信息,标准错误(standard error,stderr)则用于错误信息。这种区别允许用户选择将程序正常输出定向到一个文件中并仍将错误信息打印到屏幕上。
io::Error可以作为一个 vocabulary 类型,并且应该能够表示一些非系统错误。例如,Rust 的Path内部可以是 0 字节,对这样的Path在进行打开操作时,应该在进行系统调用之前就返回一个io::Error。 下面是std::io::Error的样子: pubstructError{repr:Repr,}enumRepr{Os(i32),Simple(ErrorKind),Custom(Box<Custom>),}...
failure是rust-lang-nursery下的一个库,可以说是根正苗红的rust库了。其目标是取代基于std::eror::Error的错误处理。 failure有两个核心组件 Fail: 定制错误类型用的trait Error: 只要实现了Fail,就能转化为该结构体 Fail trait Fail trait被用来取代std::error::Error。它提供了backtrace和cause方法去获取错误的...
代码演示:(演示打开文件,返回Result<File, Error> 类型的值,然后可以被main()中的match方式处理): 复制 use std::fs::File;use std::io::Error;fnopen_file(file_path:&str)->Result<File,Error>{letmut file=File::open(file_path)?;Ok(file)} ...
之前我们借助讲解failure库,详细说明的Rust错误处理的哲学,这有助于我们理解今天的主题,anyhow和thiserror Anyhow提供了一个anyhow::Errortrait(有点类似failure::Error)。而得益于std::error::Error所做的修改,它anyhow::Error是与std::error::Error兼容的。也就是说...