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

Rust使用winreg读取注册表不存在的键时如何捕获错误不退出

实现方案

get_value 方法返回的是 std::io::Result<T> 类型,? 运算符和 expect 方法都会在返回 Err 时终止程序(? 会向上传播错误,在返回 Result 的main函数中会直接触发程序退出),要捕获NotFound错误走自定义逻辑,需要手动匹配Result的两种状态。

你可以按如下方式修改代码:
首先导入IO错误类型:

use std::io::ErrorKind;

修改原逻辑中读取可能不存在的键的部分:

fn main() -> io::Result<()> {
    // 原有打开注册表键的逻辑保持不变
    key.set_value("TestSZ", &"written by Rust")?;
    let sz_val: String = key.get_value("TestSZ")?;
    println!("TestSZ = {}", sz_val);

    // 手动处理可能不存在的键的读取逻辑
    let other: String = match key.get_value("NOT_EXISTING_KEY") {
        Ok(val) => val,
        Err(e) => match e.kind() {
            ErrorKind::NotFound => {
                println!("Nothing found!");
                // 此处执行你的创建逻辑:如果是创建键值可以直接调用set_value
                key.set_value("NOT_EXISTING_KEY", &"default value")?;
                // 如果是创建子键,调用对应父键的create_subkey方法即可
                "default value".to_string()
            }
            // 非NotFound类的错误正常向上抛出
            _ => return Err(e)
        }
    };

    println!("NOT_EXISTING_KEY = {}", other);
    Ok(())
}

如果不需要获取返回值,仅需要判断键是否存在并执行创建逻辑,可以用更简化的if let写法:

if let Err(e) = key.get_value::<String, _>("NOT_EXISTING_KEY") {
    if e.kind() == ErrorKind::NotFound {
        println!("Nothing found!");
        // 执行创建逻辑
    }
}

内容的提问来源于stack exchange,提问作者manuel.menendez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:39:04