如果我知道生锈是不可能恐慌的,如何处理可能会恐慌

How to handle may panic if I know it is imposible to panic in rust

提问人:matej.tydli 提问时间:1/21/2023 最后编辑:user2722968matej.tydli 更新时间:1/21/2023 访问量:183

问:

我在第一次解析时遇到错误:如果索引越界,可能会恐慌。 但是在解析之前,如果应该处理这个问题。 如何正确处理错误?

print!("Write 2 ints separated by space: ");
let mut nums_string: String = String::new();
stdout().flush().expect(ERR_MSG_STDOUT_FLUSH);
stdin()
    .read_line(&mut nums_string)
    .expect(ERR_MSG_STDIN_READ_LINE);
let nums_str_vec: Vec<&str> = nums_string.trim().split(' ').collect();
let num1: i32;
let num2: i32;
if nums_str_vec.len() == 2 {
    num1 = match nums_str_vec[0].parse() {
        Err(_) => panic!("Wrong input"),
        Ok(_) => nums_str_vec[0].parse().unwrap(),
    };
    num2 = match nums_str_vec[1].parse() {
        Err(_) => panic!("Wrong input"),
        Ok(_) => nums_str_vec[1].parse().unwrap(),
    };
} else {
    panic!("Wrong input");
}

是否可以在没有 if 的情况下处理错误并仅使用匹配项?

if-语句 解析 rust 错误处理 匹配

评论


答:

2赞 mkrieger1 1/21/2023 #1

如果您知道“可能会恐慌”,则处理“可能会恐慌”的解决方案是不重复可能恐慌的代码。

如果您已经通过匹配大小写确定它是一个数字,则无需再次解析它。Ok

该数字包含在您当前忽略的值中。使用它!Ok

Ok(n) => n,
0赞 Masklinn 1/21/2023 #2

是否可以在没有 if 的情况下处理错误并仅使用匹配项?

在完成 mkrieger1 的答案之后,由于切片模式,在 vec 之前进行一些额外的转换将为您提供更简单的匹配:

let nums: Vec<Result<i32, _>> = nums_string.trim().split_whitespace().map(str::parse).collect();
match nums[..] {
    [Ok(n1), Ok(n2)] => println!("{} {}", n1, n2),
    _ => println!("Wrong input"),
}

评论

0赞 matej.tydli 1/21/2023
谢谢,但这是我第一次生锈。我无法完全理解您的代码。经过一段时间的生锈后,我肯定会看看这个解决方案。