1 个不稳定版本
0.1.0 | 2022年4月25日 |
---|
#285 in 模拟
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