【发布时间】:2022-10-02 05:43:34
【问题描述】:
给定以下 F# sn-ps
//User Code
.. code that can throw exceptions
\"Success\"
P1 政策
Policy
.Handle<CosmosException>(fun cx -> cx.StatusCode = HttpStatusCode.TooManyRequests)
.WaitAndRetryForever((fun _ cx _ -> (cx :?> CosmosException).RetryAfter.Value), (fun _ _ _ _ -> ()))
P2 政策
Policy<string>
.Handle<Exception>()
.Fallback(\"Failure\")
P3 政策
Policy<string>
.Handle<Exception>()
.Fallback(fun ex -> ex.Message)
问题 #1 - 如何组合 P1 和 P2?
将 P1 和 P2 组合到策略 P 中,以便:
- 如果用户代码成功,“成功”返回给调用者
- 如果用户代码抛出 CosmosException,P 使用返回的 RetryAfter TimeSpan 永远重试
- 如果用户代码抛出任何其他异常,“失败”将返回给调用者
问题 #2 - 如何写 P3?
在构造回退返回值时,似乎没有允许访问处理的异常以使用它的回退重载
最终范围是组合 P1 和 P3 以获得策略 PFinal,这样:
- 如果用户代码成功,“成功”返回给调用者
- 如果用户代码抛出 CosmosException,PFinal 使用返回的 RetryAfter TimeSpan 永远重试
- 如果用户代码抛出任何其他异常,则将处理的异常消息返回给调用者
标签: f# fallback polly retry-logic