MST

星途 面试题库

面试题:Rust运行时错误处理之Result类型

假设你正在编写一个函数,该函数需要读取一个文件的内容并返回其内容作为字符串。如果文件不存在,需要返回一个合适的错误。请用Rust编写这个函数,并使用`Result`类型正确处理可能出现的运行时错误。同时解释`unwrap`、`expect`和`?`操作符在处理`Result`类型时的不同及适用场景。
25.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fs::read_to_string;

fn read_file_content(file_path: &str) -> Result<String, std::io::Error> {
    read_to_string(file_path)
}

unwrapexpect?操作符的区别及适用场景

  1. unwrap

    • 区别unwrap 方法在 ResultOk 时返回内部值,为 Err 时会导致程序恐慌(panic),并打印出默认的错误信息。
    • 适用场景:适用于你确定 Result 一定会是 Ok 的情况,比如在测试代码中,或者在你已经提前做了存在性检查的情况下。但在生产代码中,如果 Result 可能为 Err,使用 unwrap 会导致程序意外终止,所以要谨慎使用。
  2. expect

    • 区别expectunwrap 类似,在 ResultOk 时返回内部值,为 Err 时导致程序恐慌。但 expect 允许你提供自定义的错误信息,而不是使用默认信息。
    • 适用场景:同样适用于你确定 Result 大概率会是 Ok 的情况,但希望在出现错误时能提供更有意义的错误信息。常用于调试阶段,帮助定位错误来源。
  3. ?

    • 区别? 操作符用于从 Result 中提取值,如果 ResultOk,则返回内部值并继续执行后续代码;如果为 Err,则直接将 Err 返回给调用者。它不会导致程序恐慌,而是优雅地将错误传递出去,让调用者来处理。
    • 适用场景:适用于在函数内部处理可能出现错误的操作,并且希望将错误向上层调用者传递的场景。这样可以避免在函数内部手动处理每个可能的错误情况,使代码更加简洁和清晰。特别是在链式调用多个可能失败的操作时,? 操作符非常方便。