< 返回版块

nickhell 发表于 2020-04-16 17:01

Tags:error

三方库一般会自定义自己的Error,如果不想在该函数内处理,考虑用Result<Someting, MyError>来返回。 需要把不同三方库的Error整合进MyError里,才能正常编译运行。 但不知如何处理?有推荐的Error库能实现该需求吗? 还是rust的哲学就是要将不同库的Error尽快处理,不要抛给上层代码?

评论区

写评论
vkill 2020-04-18 21:40

也许你需要 https://docs.rs/thiserror

solarsail 2020-04-18 17:07

可以试试 Anyhow,能把各种库的错误类型转成统一的 anyhow::Error ,只要底层库的错误类型实现了 std::error::Error。还可以用 anyhow! 宏现场生成 anyhow::Error

按作者的说法:

Use Anyhow if you don't care what error type your functions return, you just want it to be easy. This is common in application code.

作者 nickhell 2020-04-17 14:23

我用Snafu做了将三方库的Error转化成自定义Error,不知这么做是否优雅或有无明显诟病?

#[derive(Debug, Snafu)]
enum MyError {
    #[snafu(display("Could not connect the url: {}.", msg))]
    OpenUrl {
        msg: String,
    },
    #[snafu(display("Could not parse body: {}.", msg))]
    OpenBody {
        msg: String,
    },
}

type Result<T, E = MyError> = std::result::Result<T, E>;

async fn async_web_crawler(url: &str, id: u8) -> Result<String> {
    let start = SystemTime::now();

    let mut res = surf::get(url).await.map_err(|e| return MyError::OpenUrl{msg: e.to_string()})?;
    let body = res.body_string().await.map_err(|e| return MyError::OpenBody{msg: e.to_string()})?;

    println!("crawler {} cost: {:?}",id , start.elapsed().unwrap());
    Ok(body)
}

还有就是模仿官方例子中的定义错误enum时,配了source:surf::Exception,但始终报错,不知怎么用。

humphrycc 2020-04-17 00:56

可以看一下failure和它的文档.

1 共 4 条评论, 1 页