-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Handling InnerExceptions and AggregateExceptions
ℹ️ This documentation describes the previous Polly v7 API. If you are using the new v8 API, please refer to pollydocs.org.
Polly v5.6.0 adds new syntax to natively handle InnerException
s, both of ordinary exceptions and of AggregateException
.
.HandleInner<TException>() // matches any inner exception of type TException
.HandleInner<TException>(Func<TException, bool>) // matches an inner TException matching the Func
.OrInner<TException>() // as above, 'Or' syntax
.OrInner<TException>(Func<TException, bool>) // as above, 'Or' syntax
Handling inner exceptions can be freely combined with handling non-inner exceptions and with handling returned result values.
.HandleInner<TException>()
matches exceptions at both the top-level (as .Handle<>()
), and any inner exceptions.
When the operation executed through the policy throws an AggregateException
, the policy will additionally check the flattened InnerExceptions
for matches.
When the operation executed through the policy throws an ordinary (non-aggregate) Exception
, the policy will additionally recursively check any InnerException
s for matches.
When a .HandleInner<TException>(...)
clause matches an inner exception, for convenience, the policy substitutes the matched inner exception (rather than supplying the wrapping outer exception) in any place that communicates matched exceptions to calling code.
Feature | Code element that will be passed the inner exception |
---|---|
Retry policy family | onRetry |
Circuit-breaker policy family |
onBreak circuitbreaker.LastException the exception rethrown |
Fallback policy |
onFallback fallbackAction
|
ExecuteAndCapture | PolicyResult.FinalException |
This prevents user code having to duplicate the logic to extract the inner exception, and allows policy event hooks (eg onRetry
, onBreak
) to be written in a uniform manner whether the given exception is trapped as a top-level or inner exception.
If it is desired to retain the original AggregateException
information (rather than substitute the matched inner exception) this can still be achieved, by handling the AggregateException
directly:
.Handle<AggregateException>(ae => /* etc */)
- Home
- Polly RoadMap
- Contributing
- Transient fault handling and proactive resilience engineering
- Supported targets
- Retry
- Circuit Breaker
- Advanced Circuit Breaker
- Timeout
- Bulkhead
- Cache
- Rate-Limit
- Fallback
- PolicyWrap
- NoOp
- PolicyRegistry
- Polly and HttpClientFactory
- Asynchronous action execution
- Handling InnerExceptions and AggregateExceptions
- Statefulness of policies
- Keys and Context Data
- Non generic and generic policies
- Polly and interfaces
- Some policy patterns
- Debugging with Polly in Visual Studio
- Unit-testing with Polly
- Polly concept and architecture
- Polly v6 breaking changes
- Polly v7 breaking changes
- DISCUSSION PROPOSAL- Polly eventing and metrics architecture