我最近发现了一个名为 LanguageExt.Core
的 nuget,以及为什么在通过中间件等处理异常时抛出异常效率不高。
说到这里,我想知道简单检查结果是否有错误的最佳方法是什么,这样我就可以抛出异常来触发 Polly 的重试模式逻辑。
我能想到的最好的:
private async Task RunAsync(Uri uri)
{
await ConnectAsync(uri);
var result = await ConnectAsync(uri);
if (result.IsFaulted)
{
// Cannot access result.Exception because it's internal
}
_ = result.IfFail(ex =>
{
_logger.LogError(ex, "Error while connecting to the endpoint");
throw ex;
});
...
private async Task<Result<Unit>> ConnectAsync(Uri uri)
{
if (_ws is not null)
{
return new Result<Unit>(new InvalidOperationException("The websocket client is already connected"));
}
var ws = Options.ClientFactory();
try
{
using var connectTimeout = new CancellationTokenSource(Options.Timeout);
await ws.ConnectAsync(uri, connectTimeout.Token).ConfigureAwait(false);
}
catch
{
ws.Dispose();
return new Result<Unit>(new InvalidOperationException("Failed to connect to the endpoint"));
}
await _connectedEvent.InvokeAsync(new ConnectedEventArgs(uri));
_ws = ws;
IsRunning = true;
return Unit.Default;
}
最佳答案
根据评论,似乎是 ConnectAsync
可能会失败并显示 InvalidOperationException
里面 Result
目的。在这种特殊情况下 Result
的IsFaulted
设置为true
仅当 IOE
被传递到Result
的 Actor 。
因此,如果您想执行重试,那么您应该定义如下策略:
var retryPolicy = Policy<Result<Unit>>
.HandleResult(r => r.IsFaulted)
.WaitAndRetryAsync(...)
关于c# - Result<T> - 如果结果出错,则抛出异常以触发 Polly 重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74178685/