如何为可变引用场景替代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
相关产品推荐
相关产品推荐

