#drop #error #utilities #batteries-included #library

无 std try-drop

包含电池的错误处理机制,用于可能失败的析构操作

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 日

#1754Rust 模式

MIT 许可证

145KB
3K SLoC

try-drop

包含电池的错误处理机制,用于可能失败的析构操作

快速使用

对于客户端

...客户端意味着可能失败的结构体,

为您的类型实现 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