如何捕捉异步函数的恐慌?

How to catch panic for a async function?

提问人:frank C 提问时间:10/30/2023 最后编辑:cafce25frank C 更新时间:10/30/2023 访问量:87

问:

我想尝试捕捉异步函数的恐慌,如下所示:

let x = a_sync_function(param1, param2).await?;
// the return of `a_sync_function` is : Result<Vec<serde_json::Value>, Box<dyn Error>>

如果在上面的代码运行时出现任何恐慌,我想抓住恐慌并运行另一个代码; 我该怎么做?

Rust 异步等待 恐慌

评论

0赞 mousetail 10/30/2023
我认为这是不可能的,您还会从碰巧同时运行的所有其他功能中惊慌失措

答:

3赞 Chayim Friedman 10/30/2023 #1

catch_unwind() 不带未来,所以你不能使用它。

幸运的是,有 FutureExt::catch_unwind(),它用恐慌捕捉来包装未来。在后台,它用于每个 poll()。futurescatch_unwind()

use futures::FutureExt;

let x = a_sync_function(param1, param2).catch_unwind().await;
// `x` is now `Result<Result<Vec<serde_json::Value>, Box<dyn Error>>, Box<dyn Any + Send>>`
// The inner `Result` is the normal return type of the function,
// the outer `Result` is `Err` if a panic occurred with the panic payload.

评论

0赞 frank C 10/30/2023
完善!它对我来说效果很好。