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
相关产品推荐
相关产品推荐

