Struct std::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;
    })
};
// ...
Run

Tuple Fields§

§0: T

Trait Implementations§

source§

impl<S> AsyncIterator for AssertUnwindSafe<S>where S: AsyncIterator,

§

type Item = <S as AsyncIterator>::Item

🔬This is a nightly-only experimental API. (async_iterator #79024)
异步迭代器产生的项的类型。
source§

fn poll_next( self: Pin<&mut AssertUnwindSafe<S>>, cx: &mut Context<'_> ) -> Poll<Option<<S as AsyncIterator>::Item>>

🔬This is a nightly-only experimental API. (async_iterator #79024)
尝试提取此异步迭代器的下一个值,如果该值尚不可用,则注册当前任务以进行唤醒,如果异步迭代器耗尽,则返回 NoneRead more
source§

fn size_hint(&self) -> (usize, Option<usize>)

🔬This is a nightly-only experimental API. (async_iterator #79024)
返回异步迭代器剩余长度的界限。 Read more
1.16.0 · source§

impl<T> Debug for AssertUnwindSafe<T>where T: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

使用给定的格式化程序格式化该值。 Read more
1.62.0 · source§

impl<T> Default for AssertUnwindSafe<T>where T: Default,

source§

fn default() -> AssertUnwindSafe<T>

返回类型的 “默认值”。 Read more
source§

impl<T> Deref for AssertUnwindSafe<T>

§

type Target = T

解引用后的结果类型。
source§

fn deref(&self) -> &T

解引用值。
source§

impl<T> DerefMut for AssertUnwindSafe<T>

source§

fn deref_mut(&mut self) -> &mut T

可变地解引用该值。
source§

impl<R, F> FnOnce() for AssertUnwindSafe<F>where F: FnOnce() -> R,

§

type Output = R

使用调用运算符后的返回类型。
source§

extern "rust-call" fn call_once(self, _args: ()) -> R

🔬This is a nightly-only experimental API. (fn_traits #29625)
执行调用操作。
1.36.0 · source§

impl<F> Future for AssertUnwindSafe<F>where F: Future,

§

type Output = <F as Future>::Output

完成时产生的值类型。
source§

fn poll( self: Pin<&mut AssertUnwindSafe<F>>, cx: &mut Context<'_> ) -> Poll<<AssertUnwindSafe<F> as Future>::Output>

尝试将 future 解析为最终值,如果该值尚不可用,请注册当前任务以进行唤醒。 Read more
source§

impl<T> RefUnwindSafe for AssertUnwindSafe<T>

source§

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> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

获取 selfTypeIdRead more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

从拥有的值中一成不变地借用。 Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

从拥有的值中借用。 Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

返回未更改的参数。

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

调用 U::from(self)

也就是说,这种转换是 From<T> for U 实现选择执行的任何操作。

source§

impl<F> IntoFuture for Fwhere F: Future,

§

type Output = <F as Future>::Output

future 完成时将产生的输出。
§

type IntoFuture = F

我们要把它变成哪种 future?
source§

fn into_future(self) -> <F as IntoFuture>::IntoFuture

根据一个值创建一个 future。 Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

发生转换错误时返回的类型。
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

执行转换。
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

发生转换错误时返回的类型。
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

执行转换。