不可恢复的错误是检测到的错误,程序员无法处理它。 当发生这种错误时,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
环境变量来获取回溯。