[Rust] 关于三种 return Error trait 的区别是什么,如何辨别使用场景?

2022-10-02 18:13:04 +08:00
 lasuar
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)
    }
}

求大佬解答,给个链接也行~

1317 次点击
所在节点    Rust
4 条回复
lasuar
2022-10-02 18:23:02 +08:00
111
gwy15
2022-10-02 18:54:48 +08:00
第一种是返回一个实现了 StdError trait 的类型,不建议这么写
第二种是返回 trait object ,可以这么写,适用于非常简单的场景
第三种几乎永远不会用。

你的 Error 实现方式也是有问题的,现在的做法 库 一般会用 thiserror ,应用 /业务一般用 anyhow
lasuar
2022-10-02 19:34:53 +08:00
@gwy15 谢谢,我研究一下
DTCPSS
2022-10-03 06:59:54 +08:00
impl Error 应该会给每一种 Error 生成一份代码,用空间换速度。一般用 2 。或者直接用 thiserror 库做库异常处理,用 anyhow 库做应用异常处理。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX