Struct core::panic::AssertUnwindSafe
1.9.0 · source · 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
Trait Implementations§
source§impl<S: AsyncIterator> AsyncIterator for AssertUnwindSafe<S>
impl<S: AsyncIterator> AsyncIterator for AssertUnwindSafe<S>
§type Item = <S as AsyncIterator>::Item
type Item = <S as AsyncIterator>::Item
🔬This is a nightly-only experimental API. (
async_iterator
#79024)异步迭代器产生的项的类型。
1.16.0 · source§impl<T: Debug> Debug for AssertUnwindSafe<T>
impl<T: Debug> Debug for AssertUnwindSafe<T>
1.62.0 · source§impl<T: Default> Default for AssertUnwindSafe<T>
impl<T: Default> Default for AssertUnwindSafe<T>
source§impl<T> Deref for AssertUnwindSafe<T>
impl<T> Deref for AssertUnwindSafe<T>
source§impl<R, F: FnOnce() -> R> FnOnce() for AssertUnwindSafe<F>
impl<R, F: FnOnce() -> R> FnOnce() for AssertUnwindSafe<F>
1.36.0 · source§impl<F: Future> Future for AssertUnwindSafe<F>
impl<F: Future> Future for AssertUnwindSafe<F>
impl<T> RefUnwindSafe for AssertUnwindSafe<T>
impl<T> UnwindSafe for AssertUnwindSafe<T>
Auto Trait Implementations§
impl<T> Send for AssertUnwindSafe<T>where T: Send,
impl<T> Sync for AssertUnwindSafe<T>where T: Sync,
impl<T> Unpin for AssertUnwindSafe<T>where T: Unpin,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
从拥有的值中借用。 Read more
source§impl<F> IntoFuture for Fwhere
F: Future,
impl<F> IntoFuture for Fwhere F: Future,
§type IntoFuture = F
type IntoFuture = F
我们要把它变成哪种 future?
source§fn into_future(self) -> <F as IntoFuture>::IntoFuture
fn into_future(self) -> <F as IntoFuture>::IntoFuture
根据一个值创建一个 future。 Read more