【问题标题】:File::open() panics when file doesn't exist当文件不存在时 File::open() 发生恐慌
【发布时间】:2015-10-14 19:23:09
【问题描述】:

我正在运行这个:

use std::error::Error;
use std::fs::File;

fn main() {
    try_main().unwrap();
}

fn try_main() -> Result<(), Box<Error>> {
    try!(check_file("andre"));
    Ok(())
}

fn check_file(user: &str) -> Result<(), Box<Error>> {
    let suspend_file_name = format!("{}{}", "/var/cpanel/suspended/", user);
    let suspend_file = try!(File::open(suspend_file_name));

    Ok(())
}

得到这个错误:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "No such file or directory" }', libcore/result.rs:945:5

我认为这应该返回一个错误?我正在使用 Rust 1.3,但不知道我做错了什么。

【问题讨论】:

  • 题外话,但你应该使用PathBuf而不是format!来构造路径。
  • 感谢@Shepmaster 的 PathBuf 推荐。

标签: file rust


【解决方案1】:

您的程序完全按照您的指示行事。检查这个版本:

use std::{error::Error, fs::File, path::PathBuf};

fn main() -> Result<(), Box<Error>> {
    let x = check_file("andre");
    println!("{}", x.is_ok());
    Ok(())
}

fn check_file(user: &str) -> Result<(), Box<Error>> {
    let mut suspend_file_name = PathBuf::from("/var/cpanel/suspended/");
    suspend_file_name.push(user);
    let _suspend_file = File::open(suspend_file_name)?;

    Ok(())
}

输出将是false,这表明check_file 的结果是Err。如果你unwrap那:

如果值为Err,则会出现紧急情况,Err 的值会提供紧急消息。

File::open 不会恐慌,但明确表示它会在 Err 值上发生恐慌的方法确实会在 Err 值上发生恐慌。

【讨论】:

  • 非常感谢。我没有意识到 unwrap 这样做了。我有很多阅读要做。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2016-06-05
  • 2012-02-08
  • 1970-01-01
  • 2018-02-27
  • 2012-03-03
  • 2021-06-05
相关资源
最近更新 更多