gpt4 book ai didi

c# - 记录异常并重新抛出的 Polly 策略

转载 作者:太空狗 更新时间:2023-10-29 21:08:00 26 4
gpt4 key购买 nike

我考虑使用 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) =>
{
_logger.Log(exception, context);
throw exception;
});

问题:是否可以从 Fallback 中抛出异常?

超时

Policy.Timeout(1, T30meoutStrategy.Pessimistic,
(context, timespan, task) =>
{
// ContinueWith important!: the abandoned task may very well still be executing,
// when the caller times out on waiting for it!
task.ContinueWith(t =>
{
if (t.IsFaulted)
{
logger.Error(context,t.Exception);
throw exception;
}
});
}

或者重试

Policy.Handle<DivideByZeroException>().Retry(0,
(exception, retryCount) =>
{
logger.Error(context,exception);
throw exception;
});

问题:是否支持0次重试?

或者 KISS 并自己编写 简单的 try/catch 和 throw。

这些方法中哪种更好?你有什么建议?

最佳答案

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

如果您已经有了 Polly, FallbackPolicy 可以按照您建议的方式安全地重新调整用途。 onFallback委托(delegate)和回退操作或值 are not governed by the .Handle<>() clauses of the Policy ,因此您可以安全地从 onFallback 中重新抛出异常代表。

Policy<UserAvatar>.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank,
onFallback: (exception, context) =>
{
_logger.Log(exception, context);
throw exception;
});

您的问题用 TimeoutPolicy 概述的方法只会捕获调用者由于超时而早先离开的代表抛出的异常,并且只在 TimeoutMode.Pessimistic 中;并非所有异常(exception)。


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


避免重新调整用途的不整洁 FallbackPolicy ,您也可以编写自己的代码 LogThenRethrowPolicy , 在 Polly 的结构中。 This commit (其中添加了简单的 NoOpPolicy )举例说明了添加新策略所需的最低限度。您可以添加类似于 NoOpPolicy 的实现但只是try { } catch { /* log; rethrow */ }


2019 年 1 月编辑:Polly.Contrib 现在还包含一个 Polly.Contrib.LoggingPolicy这可以帮助解决这个问题。

关于c# - 记录异常并重新抛出的 Polly 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42952057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com