Rust没有异常,而是把错误分为如下两种:

  • 可恢复错误Result<T,E>
  • 不可恢复错误panic!

    panic!宏

    Rust 有panic! 宏。当执行这个宏时,程序会打印出一个错误信息,展开并清理栈数据,然后接着退出
    通过在toml中配置panic字段,可以修改宏的默认行为:

  • 默认为展开调用栈数据,再退出

  • 指定为abort时,调用宏会直接退出

当然程序中出错可能自动触发panic错误,而不需要手动使用panic!宏。

result

result是一个枚举类型,包含成功和失败两个泛型的枚举。作为返回值时通过match语句进行判断,并且可以根据T和E的具体类型进行更细化的处理:

  • T 代表成功时返回的 Ok 成员中的数据的类型
  • E 代表失败时返回的 Err 成员中的错误的类型 ```rust enum Result { Ok(T), Err(E), }
  1. <a name="vDRVR"></a>
  2. ## match result
  3. 示例:打开文件成功和失败的处理:
  4. ```rust
  5. use std::fs::File;
  6. use std::io::ErrorKind;
  7. fn main() {
  8. let f = File::open("hello.txt");
  9. let f = match f {
  10. Ok(file) => file,
  11. //根据不同error,进行更细化的处理,类似try catch的各种异常
  12. Err(error) => match error.kind() {
  13. ErrorKind::NotFound => match File::create("hello.txt") {
  14. Ok(fc) => fc,
  15. Err(e) => panic!("Problem creating the file: {:?}", e),
  16. },
  17. other_error => panic!("Problem opening the file: {:?}", other_error),
  18. },
  19. };
  20. }

unwrap与expect

如果 Result 值是成员 Ok , unwrap 会返回 Ok 中的值。如果Result 是成员 Err , unwrap 会为我们调用默认**panic!**

let f = File::open("hello.txt").unwrap();

expect 与 unwrap 的使用方式一样:返回文件句柄或调用 panic! 宏。 expect 用来调用panic!的自定义错误信息将会作为参数传递给expect ,而不像 unwrap 那样使用默认的 panic!信息。

let f = File::open("hello.txt").expect("Failed to open hello.txt");

?运算符返回Result

如果 Result 的值是 Ok ,这个表达式将会返回 Ok 中的值而程序将继续执行。如果值是 Err , Err 中的值将作为整个函数的返回值,就好像使用了 return 关键字一样,这样错误值就被传播给了调用者。

useuseusestd::io;
std::io::Read;
std::fs::File;

fn read_username_from_file() -> Result<String, io::Error> {
    let mut f = File::open("hello.txt")?;
    let mut s = String::new();
    f.read_to_string(&mut s)?;
    Ok(s)
}