Rust在Linux中的錯誤處理機制主要依賴Result類型、Option類型、?操作符及自定義錯誤類型,核心設計強調顯式錯誤處理,避免隱式異常。以下是關鍵機制:
Result<T, E>
Ok(T)
表示成功并返回值,Err(E)
表示失敗并攜帶錯誤信息。?
操作符簡化錯誤傳遞,若結果為Err
則立即返回錯誤。Option
Some(T)
表示有值,None
表示無值。match
、unwrap_or
、map
等方法處理。?操作符
Err
則直接返回錯誤,否則解包繼續執行。let content = read_file("file.txt")?;
,若文件打開失敗會直接返回錯誤。自定義錯誤類型
std::error::Error
trait定義復雜錯誤類型,支持錯誤鏈和統一處理。thiserror
(簡化自定義錯誤)、anyhow
(簡化錯誤傳播)。panic!宏
Result
處理錯誤。文件操作
use std::fs::File;
use std::io::Error;
fn read_file(path: &str) -> Result<String, Error> {
let mut file = File::open(path)?; // 錯誤傳播
let mut contents = String::new();
file.read_to_string(&mut contents)?; // 錯誤傳播
Ok(contents)
}
鏈式錯誤處理
fn parse_and_process(input: &str) -> Result<i32, String> {
input.parse::<i32>() // 解析可能失敗
.and_then(|num| { // 鏈式處理
if num > 0 {
Ok(num * 2)
} else {
Err("數字必須為正".to_string())
}
})
}
自定義錯誤
#[derive(Debug)]
enum MyError {
IoError(std::io::Error),
ParseError(String),
}
impl std::fmt::Display for MyError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
MyError::IoError(e) => write!(f, "IO錯誤: {}", e),
MyError::ParseError(s) => write!(f, "解析錯誤: {}", s),
}
}
}
std::io::Error
處理Linux系統調用錯誤(如文件權限不足、路徑不存在等)。unwrap
/expect
,強制顯式處理錯誤。Box<dyn std::error::Error>
或anyhow
處理多種錯誤類型。log
庫記錄錯誤信息,便于調試。通過上述機制,Rust在Linux中實現了安全、可維護的錯誤處理,顯著提升了代碼的健壯性。