4 个版本
0.2.0 | 2022 年 2 月 17 日 |
---|---|
0.1.2 | 2022 年 2 月 9 日 |
0.1.1 | 2022 年 2 月 9 日 |
0.1.0 | 2022 年 2 月 9 日 |
#1754 在 Rust 模式
145KB
3K SLoC
快速使用
对于客户端
...客户端意味着可能失败的结构体,
为您的类型实现 TryDrop
并按如下方式 adapt
use try_drop::TryDrop;
pub struct Foo { /* fields */ }
impl TryDrop for Foo {
type Error = Error;
unsafe fn try_drop(&mut self) -> Result<(), Self::Error> {
// do stuff
Ok(())
}
}
let foo = Foo.adapt();
...或者,如果您想避免 adapt
的样板代码
use try_drop::{TryDrop, adapters::DropAdapter};
pub struct FooInner { /* fields */ }
impl TryDrop for FooInner {
type Error = Error;
unsafe fn try_drop(&mut self) -> Result<(), Self::Error> {
// do stuff
Ok(())
}
}
pub struct Foo(pub DropAdapter<FooInner>);
impl Foo {
pub fn from_inner(inner: FooInner) -> Self {
Foo(DropAdapter(inner))
}
}
使用这种方式,如果 Foo
的析构失败,它将自动将错误打印到标准错误。
对于服务器
...服务器意味着如何处理析构错误(也意味着析构策略),
为您的结构体实现 TryDropStrategy
。
use try_drop::TryDropStrategy;
pub struct Strategy { /* fields */ }
impl TryDropStrategy for Strategy {
fn handle_error(&self, error: try_drop::Error) {
// handle the error here
}
}
...然后为这个线程安装它,
try_drop::install_thread_local_handlers(Strategy, /* other strategy, use the `PanicDropStrategy` if you don't know */)
...全局安装(意味着如果没有设置线程局部策略,则使用此策略),
try_drop::install_global_handlers(Strategy, /* other strategy */)
...如果可能,为结构体安装它。
struct Sample<D = ShimPrimaryHandler, DD = ShimFallbackHandler>
where
D: FallibleTryDropStrategy,
DD: TryDropStrategy,
{
primary: D,
fallback: DD,
/* other fields */
}
impl<D, DD> Sample<D, DD>
where
D: FallibleTryDropStrategy,
DD: TryDropStrategy,
{
pub fn new_with(/* other arguments */ primary: D, fallback: DD) -> Self {
Self {
// filled arguments
primary,
fallback,
}
}
}
let sample = Sample::new_with(Strategy, /* other strategy */)
许可证
本项目受 MIT 许可证许可。
依赖关系
~1.8–8.5MB
~74K SLoC