You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除Rust代码中的unwrap()调用?

移除Rust curl代码中的unwrap()调用

核心思路

unwrap()会在操作失败时直接触发panic,既不健壮也影响代码可读性。我们可以通过让main函数返回Result类型配合?操作符优雅处理错误;对于闭包内的错误,需要做类型转换适配curl的错误体系。

优化后的简洁版代码

use curl::easy::{Easy, WriteError};
use std::error::Error;
use std::io::{self, stdout};

fn main() -> Result<(), Box<dyn Error>> {
    let mut easy = Easy::new();
    easy.url("https://www.rust-lang.org/")?;
    
    easy.write_function(|data| {
        stdout().write_all(data).map_err(|e| WriteError::new(e))?;
        Ok(data.len())
    })?;
    
    easy.perform()?;
    
    println!("{}", easy.response_code()?);
    Ok(())
}

关键修改说明

  • 调整main函数返回值:让main返回Result<(), Box<dyn Error>>,这样就能用?替代所有unwrap(),错误会自动向上传递并打印,无需手动处理panic。
  • 闭包错误转换:stdout().write_all()返回的是io::Error,而write_function要求闭包返回Result<usize, WriteError>,所以用map_err把io::Error转换成curl兼容的WriteError,再用?处理。
  • 替换unwrap():所有unwrap()都换成?,既保留错误处理逻辑,又让代码更简洁易读。

可选的精细错误处理方案(不修改main返回值)

如果需要对每个错误做自定义提示,也可以用match或if let手动处理:

use curl::easy::{Easy, WriteError};
use std::io::{self, stdout};

fn main() {
    let mut easy = match Easy::new() {
        Ok(e) => e,
        Err(e) => {
            eprintln!("创建Easy实例失败: {}", e);
            return;
        }
    };
    
    if let Err(e) = easy.url("https://www.rust-lang.org/") {
        eprintln!("设置URL失败: {}", e);
        return;
    }
    
    if let Err(e) = easy.write_function(|data| {
        match stdout().write_all(data) {
            Ok(_) => Ok(data.len()),
            Err(e) => Err(WriteError::new(e)),
        }
    }) {
        eprintln!("设置写入回调失败: {}", e);
        return;
    }
    
    if let Err(e) = easy.perform() {
        eprintln!("执行请求失败: {}", e);
        return;
    }
    
    match easy.response_code() {
        Ok(code) => println!("{}", code),
        Err(e) => eprintln!("获取响应码失败: {}", e),
    }
}

内容的提问来源于stack exchange,提问作者Felix F Xu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:17:42