gpt4 book ai didi

rust - 即使发生功能错误,我该如何继续?

转载 作者:行者123 更新时间:2023-12-03 11:42:26 28 4
gpt4 key购买 nike

我正在使用reqwestscraper在 rust 中编写一个简单的Web刮板。我的代码的一部分被赋予了链接“next_page”,该链接可能有效也可能无效。我想尝试访问该链接,如果出现错误,请打印错误并继续下一个链接。这是我尝试做的事情:

let next_page_response = reqwest::get(next_page).await;
let next_page_response = match next_page_response {
Ok(response) => response,
Err(error) => println!("WARN: Problem getting the url '{}'. \
The error was {:?}", next_page, error),
};
这段代码被包装在一个循环中,并且 next_page每次迭代都会更改。
这不起作用, rustc给出错误 error[E0308]: 'match' arms have incompatible types。我想这是有道理的,在第一个分支中,表达式变为 Response,而在第二个分支中,表达式变为 ()。但是,如果我将 println!更改为 panic!,则代码会编译。
问题:
  • 如何确认错误然后继续?
  • 为什么panic!不起作用,为什么println!起作用?

  • Full code, for the curious

    最佳答案

    正如您在原始文章中提到的那样,问题是两个分支的返回值不匹配。正如kmdreko所述,panic!可以工作,因为它具有可以在任何地方使用的返回类型。
    因此,如果要避免出现紧急情况,则需要使每个分支的返回值都匹配。
    一种方法是让双臂返回()。如果将成功响应的处理放入比赛正文中,则代码可能非常简单。

    pub fn process_response(response: &Response) {
    // ...
    }

    for next_page in pages {
    let next_page_response = reqwest::get(next_page).await;
    match next_page_response {
    Ok(response) => process_response(response),
    Err(error) => println!("WARN: Problem getting the url '{}'. \
    The error was {:?}", next_page, error),
    };
    }
    另一种方法是让两个 ARM 都返回一个 Option,供以后使用。
    (在这种情况下,我认为它会使代码更长而更难看,但是在某些情况下它很有用)。它可能看起来像这样:
    pub fn process_response(response: &Response) {
    // ...
    }

    for next_page in pages {
    let next_page_response = reqwest::get(next_page).await;
    let next_page_response = match next_page_response {
    Ok(response) => Some(response),
    Err(error) => {
    println!("WARN: Problem getting the url '{}'. \
    The error was {:?}", next_page, error);
    None
    }
    };

    if let Some(response) = next_page_response {
    process_response(response)
    }
    }

    关于rust - 即使发生功能错误,我该如何继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65472472/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com