Struct core::panic::AssertUnwindSafe 1.9.0[−][src]
pub struct AssertUnwindSafe<T>(pub T);
Expand description
一个简单的包装器,可以断言它是 unwind 安全的。
使用 catch_unwind
时,可能某些封闭变量不是 unwind 安全的。例如,如果捕获了 &mut T
,编译器将生成一条警告,指出它不是 unwind 安全的。
然而,如果特别考虑到展开安全,这实际上可能不是由于 catch_unwind
的特定用途而造成的问题。
此包装结构体对于快速且轻便的注解很有用,因为变量确实是 unwind 安全的。
Examples
使用 AssertUnwindSafe
的一种方法是断言整个闭包本身是 unwind 安全的,绕过所有变量的所有检查:
use std::panic::{self, AssertUnwindSafe};
let mut variable = 4;
// 由于闭包捕获 `&mut variable` (默认情况下不认为 unwind 安全),因此不会编译该代码。
// panic::catch_unwind(|| { variable += 3; });
// 但是,由于 `AssertUnwindSafe` 包装器,它将进行编译
let result = panic::catch_unwind(AssertUnwindSafe(|| {
variable += 3;
}));
// ...
Run包装整个闭包就等于断言所有捕获的变量都是 unwind 安全的。不利之处在于,如果在 future 中添加了新的捕获,它们也将被视为 unwind 安全。 因此,您可能希望只包装单个捕获,如下所示。 这是更多的注解,但是它可以确保如果添加的 unwind 不安全的新捕获,您将在那时遇到编译错误,这将使您考虑该新捕获是否实际上代表错误。
use std::panic::{self, AssertUnwindSafe};
let mut variable = 4;
let other_capture = 3;
let result = {
let mut wrapper = AssertUnwindSafe(&mut variable);
panic::catch_unwind(move || {
**wrapper += other_capture;
})
};
// ...
RunTuple Fields
0: T