rust 捕获panic

作者:iohannes 发布时间: 2025-06-03 阅读量:17

同步捕获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!("任务被取消");
        }
    }
}