同步捕获panic
use std::panic;
let result = panic::catch_unwind(|| {
// 可能会 panic 的代码
panic!("故意触发 panic");
});
match result {
Ok(_) => println!("正常执行"),
Err(e) => println!("捕获到 panic: {:?}", e),
}
异步捕获panic
let handle = tokio::spawn(async {
// 你的异步代码
panic!("异步 panic 示例");
});
match handle.await {
Ok(result) => println!("任务成功: {:?}", result),
Err(e) => {
if e.is_panic() {
// 提取 panic 信息
let panic_msg = if let Some(s) = e.downcast_ref::<&str>() {
s.to_string()
} else if let Some(s) = e.downcast_ref::<String>() {
s.clone()
} else {
"Unknown panic type".to_string()
};
println!("捕获到异步 panic: {}", panic_msg);
} else {
println!("任务被取消");
}
}
}