看下面这个Rust程序,我想知道 other_error => panic!("Problem opening the file: {:?}", other_error) 这一行代码,为什么是other_error => panic...而不是_ => panic... ?
use std::fs::File;
use std::io::ErrorKind;
fn main() {
let f = File::open("hello.txt");
let f = match f {
Ok(file) => file,
Err(error) => {
match error.kind() {
ErrorKind::NotFound => {
match File::create("hello.txt") {
Ok(fc) => fc,
Err(e) => panic!("Problem creating the file: {:?}", e),
}
},
other_error => panic!("Problem opening the file: {:?}", other_error),
}
}
};
}
UUUUUUUUUUUUUUUUUUUUUUUUUU
在这段代码中,other_error => panic!("Problem opening the file: {:?}", other_error)
这一行之所以使用 other_error
,而不是 _
,是为了能够捕获和输出除 ErrorKind::NotFound
之外的所有其他类型的错误。
让我们逐步分析:
1. match error.kind()
这里的 error.kind()
返回的是 std::io::ErrorKind
枚举值。ErrorKind
枚举有多个变种,比如:
NotFound
PermissionDenied
ConnectionRefused
- 以及其他的变种。
因此,在 match error.kind()
中,我们首先匹配了 ErrorKind::NotFound
,这表示文件未找到的错误。接下来,对于其他错误,我们使用 other_error
捕获并输出。
2. other_error => panic!("Problem opening the file: {:?}", other_error)
other_error
是ErrorKind
枚举的其他变种,它不仅限于某个特定的错误类型。使用other_error
是为了能够捕获并打印所有其他的错误类型。panic!("Problem opening the file: {:?}", other_error)
这一行会把other_error
(即除NotFound
外的错误类型)作为错误信息打印出来。
为什么不使用 _
?
-
_
是一个通配符,它会匹配所有的值,但它不会将匹配到的值绑定到一个变量上。也就是说,如果我们使用_
,我们将无法访问或打印具体的错误信息,只会触发panic!
。而other_error
则是一个变量,我们可以通过它来获取具体的错误类型,并将其输出。 -
如果你想在发生其他错误时打印出具体的错误类型,
other_error
是必要的,因为它将具体的错误信息传递给panic!
,而_
不会。
因此,使用 other_error
可以帮助你在发生 NotFound
以外的错误时,捕获并输出更有用的调试信息。如果你只关心 NotFound
错误,而不需要处理其他错误类型,那么 _
也是可以的,但通常我们希望捕获并了解其他错误的类型和详情。