use std::fs::read_to_string;
fn read_file_content(file_path: &str) -> Result<String, std::io::Error> {
read_to_string(file_path)
}
unwrap
、expect
和?
操作符的区别及适用场景
-
unwrap
- 区别:
unwrap
方法在 Result
为 Ok
时返回内部值,为 Err
时会导致程序恐慌(panic),并打印出默认的错误信息。
- 适用场景:适用于你确定
Result
一定会是 Ok
的情况,比如在测试代码中,或者在你已经提前做了存在性检查的情况下。但在生产代码中,如果 Result
可能为 Err
,使用 unwrap
会导致程序意外终止,所以要谨慎使用。
-
expect
- 区别:
expect
与 unwrap
类似,在 Result
为 Ok
时返回内部值,为 Err
时导致程序恐慌。但 expect
允许你提供自定义的错误信息,而不是使用默认信息。
- 适用场景:同样适用于你确定
Result
大概率会是 Ok
的情况,但希望在出现错误时能提供更有意义的错误信息。常用于调试阶段,帮助定位错误来源。
-
?
- 区别:
?
操作符用于从 Result
中提取值,如果 Result
为 Ok
,则返回内部值并继续执行后续代码;如果为 Err
,则直接将 Err
返回给调用者。它不会导致程序恐慌,而是优雅地将错误传递出去,让调用者来处理。
- 适用场景:适用于在函数内部处理可能出现错误的操作,并且希望将错误向上层调用者传递的场景。这样可以避免在函数内部手动处理每个可能的错误情况,使代码更加简洁和清晰。特别是在链式调用多个可能失败的操作时,
?
操作符非常方便。