翻译自:https://github.com/App-vNext/Polly/wiki/Handling-InnerExceptions-and-AggregateExceptions
点此跳转到系列目录
处理 InnerExceptions 和AggregateExceptions
Polly v5.6.0增加了新的语法来原生处理InnerException
,包括普通异常和AggregateException
。
语法
.HandleInner<TException>() // 匹配类型为 TException 的所有内部异常
.HandleInner<TException>(Func<TException, bool>) // 匹配一个与Func匹配的内部TException
.OrInner<TException>() // 同上, '或' 语法
.OrInner<TException>(Func<TException, bool>) // 同上, '或' 语法
处理内部异常可以与处理非内部异常以及处理返回的结果值自由组合。
使用
.Handleinner <TException>()
既能匹配最顶层异常(如.Handle <>()
)也能匹配任何内部异常。
当通过策略执行的操作抛出一个AggregateException
时,策略将额外检查同层的InnerExceptions
是否匹配。
当通过策略执行操作时,抛出一个普通(非聚合)Exception
,策略将递归地检查任何InnerException
是否匹配。
Communicating matched inner exceptions to calling code
当.Handleinner <TException>()
子句匹配到内部异常时,为了方便起见,策略将匹配的内部异常替换为与调用代码通信的任何位置(而不是提供包装的外部异常)。
Feature | 内部异常将会传递到的代码位置 |
---|---|
重试类策略 | onRetry |
断路器类策略 | onBreak circuitbreaker.LastException the exception rethrown |
回退策略 | onFallback fallbackAction |
ExecuteAndCapture | PolicyResult.FinalException |
这可以避免用户不得不复制代码逻辑提取内部异常,这样还可以使得给定的异常不管是顶级异常还是内部异常都能通过策略事件钩子(例如onRetry
,onBreak
)以统一方式处理。
保留完整的AggregateException
信息
如果想要保留原来的AggregateException
信息(而不是替换匹配的内部异常),仍然可以通过直接处理AggregateException
来实现:
.Handle(ae => /* etc */)
翻译自:https://github.com/App-vNext/Polly/wiki/Handling-InnerExceptions-and-AggregateExceptions
点此跳转到系列目录