Wang's blog

十二、错误处理

Published on

panic

最简单的错误处理方式是使用panic!宏,它简单地打印错误并退出程序。

panic!("crash and burn");

abort/unwind

处理panic有两种方式,可以通过编译器参数或配置文件的方式设置。默认为unwind

  • unwind:回溯调用栈并进行清理工作
  • abort:立即退出

Option

在Rust中,如果一个函数返回类型T,则它必须返回一个变量,不能返回空(类似NULL或nullptr),这样可以避免用户不检查空指针造成错误。如果确实需要返回空,则可以使用Option。Option是std库提供的一个枚举类型。Option<T>的取值为以下二者之一:

  • Some(T):包含一个T类型的元素
  • None:不包含任何元素

编译器会强制用户处理值为None的情况,从而提高安全性。Option的操作方式有:

  • match:与其它枚举的处理方式相同,需要处理所有可能情况
  • 解包:为Some时获取其值,为None时执行不同操作
    • unwrap:为None时panic
    • expect:为None时使用自定义信息报错
    • ?:为None时使当前所在函数返回None
    • or:为None时返回另一值。链式、立即
    • or_else:为None时调用函数获取值并返回。链式、延迟
    • get_or_insert:为None时插入值。立即
    • get_or_insert_with:为None时调用函数获取值并插入。延迟
  • 使用combinator进行后续操作:
    • map:有值则对其进行操作,否则返回None
    • and_then:有值则解包其值并进行操作,否则返回None

Result

Option只返回了错误,但是并不知道错误的原因。Result加强了这一点。一个Result<T, E>的取值为以下二者之一:

  • Ok(T):成功,并返回一个T类型的值
  • Err(E):失败,并返回一个E类型错误

Result同样可以使用match, unwrap, ?, map, and_then等进行操作。