Фильтр по предикату
Предикат может предоставлять расширенные критерии и логику фильтрации.
public void AttemptCall(Action action, Predicate<Exception> match)
{
try
{
action();
}
catch(Exception e)
{
if(match(e))
state.ActUponException(e);
throw;
}
}
Например, вы можете увеличить автоматический выключатель только на WebException
, вызванном тайм-аутом.
circuitBreaker.AttemptCall(() => service.DoWork(), e =>
{
WebException local = e as WebException;
if(local == null)
return false;
return local.Status == WebExceptionStatus.Timeout;
});