C# Polly重试除特定条件外的所有异常
Polly中是否有方法重试除指定异常之外的所有异常。。例如:C# Polly重试除特定条件外的所有异常,c#,polly,C#,Polly,Polly中是否有方法重试除指定异常之外的所有异常。。例如: var p = Policy .Handle<HttpListenerException>(e => !(e.NativeErrorCode == 1)) .Or<Exception>() .RetryAsync(); 那是线程安全的吗| 如果查看该文件,则可以看到句柄方法是如何定义的: 公共部分类策略 { 公共静态PolicyBuilder句柄(),其中TException:异
var p = Policy
.Handle<HttpListenerException>(e => !(e.NativeErrorCode == 1))
.Or<Exception>()
.RetryAsync();
那是线程安全的吗| 如果查看该文件,则可以看到句柄
方法是如何定义的:
公共部分类策略
{
公共静态PolicyBuilder句柄(),其中TException:异常
=>新建PolicyBuilder(异常=>异常为TException?异常:null);
公共静态PolicyBuilder句柄(Func exceptionPredicate),其中TException:Exception
=>新建PolicyBuilder(异常=>异常为TException TException&&exceptionPredicate(TException)?异常:null);
...
}
公共部分阶级政策
{
公共静态PolicyBuilder句柄(),其中TException:异常
=>新建PolicyBuilder(异常=>异常为TException?异常:null);
公共静态PolicyBuilder句柄(Func exceptionPredicate),其中TException:Exception
=>新建PolicyBuilder(异常=>异常为TException TException&&exceptionPredicate(TException)?异常:null);
...
}
- 所有方法都依赖于具有。
- 因此,我们不能在自定义代码中使用它
- 还要注意
类。策略
- 因此,我们不能创建
实例,这就是为什么为Policy
类创建扩展方法没有意义Policy
- 因此,我们不能创建
公共静态类PolicyExt
{
公共静态PolicyBuilder HandleExcept(),其中TException:Exception
=>Policy.Handle((异常异常)=>异常为TException为false);
公共静态PolicyBuilder HandleExcept(Func exceptionPredicate),其中TException:Exception
=>Policy.Handle((异常异常)=>异常为TException为false | |异常为TException TException&!异常谓词(TException));
}
公共静态类PolicyExt
{
公共静态PolicyBuilder句柄(),其中TException:异常
=>Policy.Handle((异常异常)=>异常为TException为false);
公共静态PolicyBuilder句柄(Func exceptionPredicate),其中TException:Exception
=>Policy.Handle((异常异常)=>异常为TException为false | |异常为TException TException&!异常谓词(TException));
}
最后是一个快速测试:
var policy=PolicyExt.HandleExcept(ex=>ex不支持Exception)
.WaitAndRetry(2,=>TimeSpan.FromSeconds(2));
//或者只是:
//var policy=PolicyExt.HandleExcept()
//.WaitAndRetry(2,=>TimeSpan.FromSeconds(2));
policy.Execute(()=>
{
Console.WriteLine(“已被调用”);
抛出新的NotSupportedException();
});
输出:
Have been called
Unhandled exception. System.NotSupportedException: Specified method is not supported.
- 因此,在
的情况下,不会触发重试逻辑NotSupportedException
- 但如果我们针对以下委托执行策略:
policy.Execute(()=>
{
Console.WriteLine(“已被调用”);
抛出新异常(“自定义”);
});
然后,输出将如下所示:
Have been called
Have been called
Have been called
Unhandled exception. System.Exception: Custom
因此,会触发重试。有很多方法可以编写此命令。我认为最干净的方法是
.Handle(e=>e.NativeErrorCode!=1)。或者(e=>!(e是HttpListenerException))
(也就是说,只需将HttpListenerException
从最具包容性的检查中排除)。最短的方法可能是.Handle(e=>(e作为HttpListenerException)?.NativeErrorCode!=1)
,但这不必要地神秘。啊,是的,我喜欢这样。我的等效于e.NativeErrorCode!=1实际上有点复杂,但这可能会很好地工作。。。我将检查它的(不)可读性!:)+1至@Jeroenmoster's。重线程安全:Polly策略本身是完全线程安全的。而且您的SomethingMoreComplex(…)
谓词没有共享任何可能使其成为非线程安全的范围外的状态。所以,LGTM。可能是
Have been called
Have been called
Have been called
Unhandled exception. System.Exception: Custom