2015-10-14 54 views
-1

我運行此:文件:: open()的恐慌,當文件不存在

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(()) 
} 

而且收到此錯誤:

Running `target/debug/test` 
thread '<main>' panicked at 'called `Result::unwrap()` on an `Err` value: Error { repr: Os { code: 2, message: "No such file or directory" } }', ../src/libcore/result.rs:731 
An unknown error occurred 

我想這應該返回一個錯誤?我正在使用Rust 1.3,不知道我做錯了什麼。

+2

如果你能發佈一個編譯和展示這個錯誤的完整程序,它會更有幫助。我認爲問題出在你發佈的代碼片段上(也許你誤解了'try!'的作用) – Adrian

+1

'File :: open' 100%**不會恐慌**如果文件不存在。 [這是證明](http://is.gd/0uy4H0)。 – Shepmaster

+1

偏離主題,但您應該使用['PathBuf'](http://doc.rust-lang.org/std/path/struct.PathBuf.html)來構建路徑而不是'format!'。 – Shepmaster

回答

4

您的程序正在按照您所說的完成。檢查此版本:

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

fn main() { 
    let x = try_main(); 
    println!("{}", x.is_ok()); 
} 

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(()) 
} 

輸出爲false,這表明的try_main結果是一個Err。如果您unwrap說:

Panics if the value is an Err, with a panic message provided by the Err's value.

所以,File::open不慌,但方法明確表示,將恐慌Err值上Err值確實恐慌。

+0

非常感謝。我沒有意識到解包就是這樣做的。我有很多閱讀要做。 –