use std::error::Error;
use std::fmt::{Debug, Display, Formatter};
pub fn test() {
#[derive(Debug)]
struct MyErr;
impl Display for MyErr {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
f.write_str("MyErr happened")
}
}
impl Error for MyErr {}
// 三种返回 error 方式的区别是什么? 待解答
fn f3() -> Result<i32, impl Error> {
Result::Err(MyErr)
}
fn f3_1() -> Result<i32, Box<dyn Error>> {
Result::Err(Box::new(MyErr))
}
fn f3_2() -> Result<i32, &'static dyn Error> {
Result::Err(&MyErr)
}
}
求大佬解答,给个链接也行~
1
lasuar OP 111
|
2
gwy15 2022-10-02 18:54:48 +08:00 1
第一种是返回一个实现了 StdError trait 的类型,不建议这么写
第二种是返回 trait object ,可以这么写,适用于非常简单的场景 第三种几乎永远不会用。 你的 Error 实现方式也是有问题的,现在的做法 库 一般会用 thiserror ,应用 /业务一般用 anyhow |
4
DTCPSS 2022-10-03 06:59:54 +08:00 via iPhone
impl Error 应该会给每一种 Error 生成一份代码,用空间换速度。一般用 2 。或者直接用 thiserror 库做库异常处理,用 anyhow 库做应用异常处理。
|