C# Polly策略记录异常并重试 我考虑使用创建策略来记录异常并重新抛出。 我没有找到一个现有的方法,允许它开箱即用,但我看到的一些选项是

C# Polly策略记录异常并重试 我考虑使用创建策略来记录异常并重新抛出。 我没有找到一个现有的方法,允许它开箱即用,但我看到的一些选项是,c#,exception,polly,C#,Exception,Polly,回退 // Specify a substitute value or func, calling an action (e.g. for logging) // if the fallback is invoked. Policy.Handle<Whatever>() .Fallback<UserAvatar>(UserAvatar.Blank, onFallback: (exception, context) => { _logg

回退

// Specify a substitute value or func, calling an action (e.g. for logging)
// if the fallback is invoked.
Policy.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank,
    onFallback: (exception, context) =>
    {
        _logger.Log(exception, context);
        throw exception;
    });
重试

Policy.Handle<DivideByZeroException>().Retry(0,
(exception, retryCount) =>
{
    logger.Error(context,exception);
    throw exception;
});
Policy.Handle()。重试(0,
(例外情况,retryCount)=>
{
logger.Error(上下文、异常);
抛出异常;
});
问题:是否支持0次重试

或者亲吻并写下自己扔掉的简单的try/catch

以下哪种方法更好?
您的建议是什么?

如果您的组合中还没有Polly,那么try/catch似乎是最简单的

如果你已经有了波莉,可以安全地按照你建议的方式重新安排。
onFallback
委托和回退操作或值,因此您可以从
onFallback
委托中安全地重新引发异常

Policy<UserAvatar>.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank,
    onFallback: (exception, context) =>
    {
        _logger.Log(exception, context);
        throw exception;
    });
Policy.Handle()
.Fallback(UserAvatar.Blank,
onFallback:(异常,上下文)=>
{
_logger.Log(异常、上下文);
抛出异常;
});

您的问题所概述的方法只能捕获调用方先前因超时而退出的代理抛出的异常,并且只能在
TimeoutMode.悲观的
;并非所有的例外


您的问题用
概述的方法。重试(0,…)
将不起作用。如果未指定重试,则不会调用
onRetry
委托


为了避免重新调整
后备策略
,您还可以在Polly的结构中编写自己的
LogThenRethrowPolicy
。(添加了简单的内容)举例说明了添加新策略所需的最低限度。您可以添加类似于
NoOpPolicy
的实现,但只需
尝试{}catch{/*log;rethrow*/}


编辑2019年1月:Polly.Contrib现在还包含一个可以帮助实现这一点的选项。

显示您可以使用
onRetry:
选项,至少对于WaitAndRetryAsync是这样。我还没看过其他人

HttpPolicyExtensions
.HandleTransientHttpError()
.WaitAndRetryAsync(3,
    retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))  // exponential back-off: 2, 4, 8 etc
                    + TimeSpan.FromMilliseconds(Jitterer.Next(0, 1000)), // plus some jitter: up to 1 second
    onRetry: (response, calculatedWaitDuration) =>
    {
        logger.LogError($"Failed attempt. Waited for {calculatedWaitDuration}. Retrying. {response.Exception.Message} - {response.Exception.StackTrace}");
    }
);

我不想重试,只想记录并重新抛出。你知道日志策略的NuGet包在哪里吗?我在GitHub上没有看到链接,我尝试在NuGet中搜索Polly.Contrib和Polly.Contrib.LoggingPolicy。这两个包似乎都不存在,尽管我发现Polly.Contrib的一些子包似乎并不相关。
HttpPolicyExtensions
.HandleTransientHttpError()
.WaitAndRetryAsync(3,
    retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))  // exponential back-off: 2, 4, 8 etc
                    + TimeSpan.FromMilliseconds(Jitterer.Next(0, 1000)), // plus some jitter: up to 1 second
    onRetry: (response, calculatedWaitDuration) =>
    {
        logger.LogError($"Failed attempt. Waited for {calculatedWaitDuration}. Retrying. {response.Exception.Message} - {response.Exception.StackTrace}");
    }
);