本文概述
不可恢复的错误是检测到的错误, 程序员无法处理。当发生此类错误时, 请panic!!宏被执行。panic!!打印失败消息。panic!!宏展开将清理堆栈, 然后退出。
- 展开:展开是从其遇到的每个函数的堆栈存储器中清除数据的过程。但是, 展开过程需要大量工作。展开的替代方法是中止。
- 中止:中止是在不清除堆栈存储器中数据的情况下结束程序的过程。操作系统将删除数据。如果我们从平缓切换到中止, 那么我们需要添加以下语句:
panic = 'abort';
让我们看一个简单的panic!例子!巨集:
fn main()
{
panic!(?No such file exist?);
}
输出
在上面的输出中, 第一行显示了错误消息, 该消息传达了两个信息, 即紧急消息和错误位置。紧急消息是”不存在这样的文件”, 并且error.rs:3:5表示它是我们文件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 Backtrace是已被调用以了解”发生错误的所有原因”的所有功能的列表。我们需要设置RUST_BACKTRACE环境变量来获取回溯。