Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Polly重试除特定条件外的所有异常_C#_Polly - Fatal编程技术网

C# Polly重试除特定条件外的所有异常

C# Polly重试除特定条件外的所有异常,c#,polly,C#,Polly,Polly中是否有方法重试除指定异常之外的所有异常。。例如: var p = Policy .Handle<HttpListenerException>(e => !(e.NativeErrorCode == 1)) .Or<Exception>() .RetryAsync(); 那是线程安全的吗| 如果查看该文件,则可以看到句柄方法是如何定义的: 公共部分类策略 { 公共静态PolicyBuilder句柄(),其中TException:异

Polly中是否有方法重试除指定异常之外的所有异常。。例如:

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