Struct std::panic::AssertUnwindSafe 1.9.0[−][src]
pub struct AssertUnwindSafe<T>(pub T);
Expand description
一个简单的包装器,可以断言它是 unwind 安全的。
使用 catch_unwind
时,可能某些封闭变量不是 unwind 安全的。例如,如果捕获了 &mut T
,编译器将生成一条警告,指出它不是 unwind 安全的。
但是,如果特别考虑了 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