Rust 有两种错误,可预知的错误和不可预知的错误。一般对于可预知的错误,Rust 期望进行处理,对于不可预知的错误,一般会通过panic!宏中断程序执行。

Rust有两种错误处理方式,即 Reslt<T, E> panic!

9.1 使用 panic! 处理未知错误

在需要处理的地方直接使用panic!("error") 中断,程序会直接退出。

可以使用 RUST_BACKTRACE=1环境变量为输出 panic时的堆栈,来帮助分析定位问题。

9.2 使用 Result 处理已知错误

ResultOption类似,是一个枚举,一般用来表示结果。

enum Result<T, E> {
    Ok(T);
    Err(E);
}

一般使用Err来表示错误,标准库里都是这么用的。
到目前为止,一切正常,就是使用一个枚举来表示成功或失败。可以使用 match 进行匹配两种情况。

Result 有几个相关的函数可以使用:

  • unwraper ,直接取出Ok的值,如果是 Err,直接调用 panic!
  • except,类似 unwraper ,区别在于传入一个错误,用于panic!

9.3 ? 操作符

? 操作符用于 Option, Result 类型或其他任意实现了FromResidual特性的类型,类似于c#?. ,区别在于

  1. rust?作用于表达式,可以与.分开使用
  2. rust?当前面的值为 NoneErr时,直接返回该值并退出函数,而不是跳过.调用。

9.4 选择panic! 还是Result

通常情况下,如果是以下情形会选择panic:

  • 在示例代码、原型代码、测试代码中。此时通常需要直接中断来获取错误信息。
  • 在开发人员更有把握的情况下,有时开发人员能够确定逻辑是正确的,不会发生错误,可以直接调用类似 exceptunwraper等函数。
  • 一些会破坏程序的操作。如果一些操作后,会导致系统处理错误的状态,可以选择中断。

可以通过封装类型来确保数据处于安全的状态。

pub struct Guess {
	value: i32,
}

imp Guess{
	pub fn new(value: i32) -> Guess{
		if value < 1 || value > 100 {
			panic!("Guess value must be between 1 and 100, got {}.", value);
		}

		Guess{value}
	}

	pub fn value(&self) -> i32 {
		self.value
	}
}

要求开发人员必须明确接受的值在0~100之间。

  • 打赏
  • 分享
分享到...
请选择打赏方式
  • 微信
  • 支付宝

By yhl

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注