0%

Rust错误处理

消除失败

  • 常用六个Assert
    • assert!:断言布尔表达式运行时一定返回true
    • assert_eq!:断言两个表达式是否相等(使用PartialEq)
    • assert_ne!:断言两个表达式是否不相等
    • debug_assert!:等价于assert!,用于调试模式
    • debug_assert_eq!
    • debug_assert_ne!

分层处理错误

  • Option:处理有和无的情况,包含Some(T)和None两个选体。不存在的对应值应返回None,开发者需要对None进行处理,而不是直接引发恐慌
  • Result<T, E>:用于处理合理解决的问题,如文件没找到、权限被拒绝、字符串解析出错等
  • 线程恐慌(Panic):用于处理无法合理解决的问题
  • 程序中止(Abort):使用abort函数将进程正常中止

unwrap系列方法

  • unwrap方法可以取出包含于Some内部的值,但遇到None会引发线程恐慌
  • unwrap_or方法是对match匹配包装的语法糖,该方法可以指定处理None时返回的值
  • unwrap_or_else方法和unwrap_or类似,只不过参数是FnOnce()->T闭包

map系列方法

把Option中值通过unwrap取出来再参与计算,会多出很多校验代码,显得冗余,map系列方法可以改善这种情况

  • map方法是泛型方法,内部是match匹配,对于Some和None分别做了相应处理,参数为FnOnce(T)->U闭包,在无需取Option的情况下在Option内部计算,这种map叫组合子
  • map_or方法
  • map_orelse方法
  • and_then组合子,直接返回值内容,而不经过Some包装

错误处理Result<T, E>

  • 从语义上来说,Option可以看做是忽略了错误类型的Result<T, ()>,Result<T, E>枚举体包含两个变体:Ok(T)和Err(E)。使用#[must_use]用来警告应该进行错误处理

恐慌(Panic)

  • Rust中,使用恐慌安全(Panic Safety)来代替异常安全的说法。Rust中有一些代码会引发恐慌,如None进行unwrap操作、除以0等。Rust提供一个叫UnwindSafe的标记trait,专门标记恐慌安全你的类型,catch_unwind方法可以捕获恐慌,恢复当前线程,除了使用abort引发的进程中止无法捕获
  • 可以使用std::panic::set_hook方法来自定义消息

扩展