panic是线程级别,一个线程panic,其他线程可以继续服务。可以捕获panic让线程存活。发生panic,调用栈会展开,这是panic的默认处理行为。
catch_unwind()。
enum Result<T, E> {
Ok(T),
Err(E),
}
rust中Result的定义,可以理解为Result是个pair,left是成功时,right时失败时,而Ok(10);,则是Result的left被设置为10,Err("error")则是Reslt的right被设置为"error"。
下面的代码并不是打印expect中的内容:
fn main() {
let success: Result<i32, &str> = Ok(10);
let error: Result<i32, &str> = Err("not good");
println!("{}", error.expect("format error not correct"));
}
在 Rust 中,使用 ? 运算符处理错误时,如果发生了错误,它会立即将错误返回给调用者,这类似于其他语言中的“重新抛出”(rethrow)异常的机制。
fn main() {
match process(5) {
Ok(_) => println!("Process succeeded"),
Err(e) => println!("Process failed: {}", e),
}
match process(-1) {
Ok(_) => println!("Process succeeded"),
Err(e) => println!("Process failed: {}", e),
}
}
fn check_param(param: i32) -> Result<(), &'static str> {
if param > 0 {
Ok(())
} else {
Err("Parameter must be greater than zero")
}
}
fn process(param: i32) -> Result<(), &'static str> {
// 使用 ? 运算符来简化错误处理
check_param(param)?;
// 如果 check_param 成功,继续执行下面的代码
println!("Parameter is valid: {}", param);
Ok(())
}
也就是说,在rust中,错误处理等逻辑基本都是Result类型返回了。