#exception #panic #async #sync #context #global

asynx

帮助您在异步Rust中无panic地模拟异常的库

1 个不稳定版本

0.1.0 2022年4月25日

#285 in 模拟

MIT/Apache

22KB
217 代码行

ASYNc 异常

在异步Rust中无panic地模拟异常。

免责声明:这个crate只是为了实现我的想法。它可能不是良好的实践。

在您的项目中使用

[dependencies]
asynx = "0.1"

请参阅 docs.rs 文档 了解使用方法。

您可以通过

[dependencies]
asynx = { version = "0.1", default-features = false }

来在 no_std 环境中使用它,这将禁用 global 实现。

请参阅 此博客 了解主要思想。

警告:在 asynx::sync 下的同步实现有许多不安全代码。使用时请自行承担风险。

许可证

本项目根据MIT许可证和Apache许可证(版本2.0)的条款分发。


lib.rs:

帮助您在异步Rust中无panic地模拟异常的库。

有一个不同步版本 unsync::ExceptionContext 和一个同步版本 sync::ExceptionContext

您还可以将上下文定义为静态变量,这样您就不需要通过函数参数传递它们,使用 global::ExceptionContext

请参阅 此博客 了解主要思想。

示例

type ExcptCtx = asynx::unsync::ExceptionContext<String>;

async fn perform(ctx: &ExcptCtx, success: bool) -> String {
    if success {
        "success".to_string()
    } else {
        ctx.throw("failed".to_string()).await
    }
}

tokio_test::block_on(async {
    let r = ExcptCtx::new()
        .catch(|ctx| async move {
            assert_eq!("success".to_string(), perform(ctx, true).await);
            perform(ctx, false).await;
            unreachable!() // The previous statement throws an exception.
        })
        .await;
    assert_eq!(Err("failed".to_string()), r)
});

依赖项

~46KB