【发布时间】:2021-12-02 21:34:30
【问题描述】:
我想读取一个文本文件并将所有行转换为 int 值。 我使用这个代码。 但我在这里真正想念的是一种“好”的错误处理方式。
use std::{
fs::File,
io::{prelude::*, BufReader},
path::Path
};
fn lines_from_file(filename: impl AsRef<Path>) -> Vec<i32> {
let file = File::open(filename).expect("no such file");
let buf = BufReader::new(file);
buf.lines()
.map(|l| l.expect("Could not parse line"))
.map(|l:String| l.parse::<i32>().expect("could not parse int"))
.collect()
}
问题:如何进行正确的错误处理? 这是上面的例子“好的锈代码”吗? 还是我应该使用这样的东西:
fn lines_from_file(filename: impl AsRef<Path>) -> Vec<i32> {
let file = File::open(filename).expect("no such file");
let buf = BufReader::new(file);
buf.lines()
.map(|l| l.expect("Could not parse line"))
.map(|l:String| match l.parse::<i32>() {
Ok(num) => num,
Err(e) => -1 //Do something here
}).collect()
}
【问题讨论】:
-
如 Rust Lang 书中所列,当错误泛化时使用 expect,当发生此错误的原因可能有多种时,您可以匹配它并在 stderr 上打印错误,或者只是如果这是为程序员设计的,请恐慌
-
如果您的程序需要有效输入,则您的第一个示例很好,如果数据有问题,则应该无法继续。第二个更宽容,并且将允许您可以通过忽略 -1 或其他东西来解决的错误值。无论哪种方式都可以,但是您应该尝试保持一致。 (由于您对错误的行感到恐慌,我建议您也对错误的解析感到恐慌,但我不知道您的最终目标)
-
“良好”的错误处理完全取决于发生错误时您想要做什么。
expect()在某些情况下很好。
标签: rust