橘子味的心
标题:Rust不可恢复的错误

不可恢复的错误是检测到的错误,程序员无法处理它。 当发生这种错误时,panic!宏会被执行。panic!打印失败消息。 panic!清理堆栈然后退出。

展开(Unwinding):展开是一个清理它遇到的每个函数的堆栈内存中的数据的过程。 但是,展开过程需要大量工作。Unwinding的替代方案是Aborting
中止(Aborting):中止是在不清除堆栈内存中的数据的情况下结束程序的过程。操作系统将删除数据。如果从展开切换到中止,那么需要添加以下语句:

panic = 'abort';

下面来看一个panic!宏的简单示例:

fn main()  
{
   panic!(?No such file exist?);
}

执行上面示例代码,得到如下结果 -

在上面的输出中,第一行显示错误消息,它传达两个信息,即panic消息和错误的位置。 panic消息是“没有这样的文件存在” 和 error.rs:3:5 表示文件的第三行和第五个字符。

注意:一般来说,不实现panic!在程序代码中,包含文件名和行号的错误消息可以在其他人的代码中调用panic!宏。

panic!的好处

Rust语言没有缓冲区重读问题。缓冲区重写是一种情况,当从缓冲区读取数据并且程序超出缓冲区时,即它读取相邻的存储器。 这导致违反内存安全。

下面来看一个简单的例子:

fn main()  
{  
   let v = vec![20,30,40];  
   print!("element of a vector is :",v[5]);  
}

执行上面示例代码,得到以下结果 -

在上面的例子中,试图访问索引5所在的第六个元素。在这种情况下,Rust会因为访问无效索引而引发panic。 因此,Rust不会返回任何内容。
但是,对于其他语言(如C和C++),它们会返回一些内容,尽管该向量不属于该内存。 这称为缓冲区重写,它会导致安全问题。

Rust回溯
Rust回溯是调用的所有函数的列表,用于了解“导致错误的原因”。 需要设置RUST_BACKTRACE环境变量来获取回溯。


分类