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 ![]() 第一种是返回一个实现了 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 库做应用异常处理。 |