[英]How do I generify the error of a Rust Result<T, E> to Result<T, Box<dyn std::error::Error>>?
[英]Does the standard define an alias to Result<T, dyn std::error::Error>?
我知道Result
aliasing idiom ,您可以在其中为自定义错误类型定义别名。 经典示例似乎是std::io::Result
,它可能返回std::io::Error
:
pub type Result<T> = Result<T, std::io::Error>;
尽管我编写了自定义错误类型,但通常情况下会出现一般情况,特别是在顶级函数(处理所有类型的错误)上。 我注意到我时不时地使用标准的Error
特征,所以我反复写Result<T, Box<dyn std::error::Error>>
。
然后让我想知道:标准是否在某处定义了Result<T, Box<dyn Error>>
的别名?
如果没有,是否有任何推荐的处理方法?
dyn std::error::Error
是一个trait object ,可以引用任何实现Error
trait 的类型。 这意味着该类型在编译时没有已知的大小; 它被称为动态大小类型。
因此,类型Result<T, dyn std::error::Error>
也是动态调整大小的,因为它需要能够保存任何合适的错误类型。 这意味着您不能在大多数上下文中直接使用此类型,特别是不能作为函数的返回类型,因此它不是特别有用。
您可能指的是Result<T, Box<dyn std::error::Error>>
,它将特征对象放在指针后面,因此Result
类型本身具有已知大小。
标准是否定义了
Result<T, std::error::Error>
的别名?
Rust 语言没有由标准指定。 Rust 有一个标准库,但它不包含Result<T, Box<dyn std::error::Error>>
的别名。 如果您需要这样的别名,您只需自己将其添加到您的代码中即可。
您可能还对anyhow
crate感兴趣,它定义了任何实现std::error::Error
错误类型都可以转换为的anyhow::Error
类型,以及默认为该错误类型的anyhow::Result
类型别名。 板条箱使用非常广泛,并且尽可能接近处理任意错误的“标准”方式。
作为旁注,类型别名定义
pub type Result<T> = Result<T, std::io::Error>;
您在问题中引用的内容无效,因为右侧的Result
解析为当前定义的Result
,因此它是循环的。 如果要将前奏中的Result
类型别名为也称为Result
的别名,则需要编写
pub type Result<T> = std::result::Result<T, std::io::Error>;
反而。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.