You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为可变引用场景替代std::panic::catch_unwind捕获panic?

解决Rust可变引用场景下捕获panic的问题

你之前的代码报错根本不是std::panic::catch_unwind不能和可变引用一起用,而是不能对字面量0创建可变引用——&mut 0这种写法本身就不符合Rust规则,因为字面量是不可变的临时值,没法获取它的可变引用。

只要修正这个变量的问题,就能正常用catch_unwind捕获panic,完全不用修改原有函数的可变引用参数,不会影响其他代码。

修改后的测试代码如下:

fn divide(x: &mut i32, y: &mut i32) -> i32 {
    assert!(*y != 0, "Attempted to divide by zero");
    *x / *y
}

#[test]
fn test_divide() {
    let mut x = 10;
    let mut y = 2;
    assert_eq!(divide(&mut x, &mut y), 5);
    
    let mut x = 10;
    let mut y = -2;
    assert_eq!(divide(&mut x, &mut y), -5);

    // 把0放到可变变量里,再传可变引用
    let mut x = 10;
    let mut y_zero = 0;
    let result = std::panic::catch_unwind(|| divide(&mut x, &mut y_zero));
    assert!(result.is_err());
    
    // 安全提取panic信息
    if let Some(msg) = result.unwrap_err().downcast_ref::<&'static str>() {
        assert_eq!(*msg, "Attempted to divide by zero");
    } else {
        panic!("捕获到非预期类型的panic");
    }
}

核心要点:

  • catch_unwind对闭包里的可变引用没有限制,只要闭包本身是合法的Rust代码就行
  • 你之前的错误是字面量无法被可变借用,和catch_unwind无关
  • 只需要给要传入的0创建一个可变绑定,就能正常触发并捕获panic,完全不用改动原有业务函数的参数结构

内容的提问来源于stack exchange,提问作者user21258840

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 15:25:26