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環境變數來獲取回溯。