65.9K
CodeProject is changing. Read more.
Home

TryRepeat

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (11 votes)

Sep 9, 2013

CPOL
viewsIcon

15238

A small tip to retry an action, with an easy to use extension.

Introduction 

This is just a short description of my thoughts of handling exceptions and at the same time offering a retry.

Try Repeat 

I created an extension method just to make it convenient to use. The method extends an Action so that you just have to call (Action).TryRepeat(method) with a method that returns a Boolean to indicate if the action should retry or not. 

/// <summary>
/// Tries the specified action.
/// </summary>
/// <param name="action">The action.</param>
/// <param name="failAction">The fail action.</param>
/// <returns></returns>
public static void TryRepeat(this Action action, Func<Exception, bool> failAction)
{
  bool repeat;
  do
  {
    try
    {
      action();
      return;
    }
    catch (Exception e)
    {
      if (Debugger.IsAttached) Debugger.Break();
      repeat = failAction(e);
    }
  } while (repeat);
}

To use the extension method you can do this:

Action a = () => 
{
   // Put your code here
};
a.TryRepeat(evaluationFunction);

The evaluation function takes the Exception as input and returns a Boolean value to indicate if the action should be repeated. It could look like this:

public static bool HandleException(Exception e)
{
  if (e is SomeException)
  {
    MessageBoxResult result = 
      MessageBox.Show("Connection seems lost, reconnect?", "Error",
                      MessageBoxButton.YesNo);
    return result == MessageBoxResult.Yes;
  }
  return false;
}

Points of Interest 

I'm not thrilled about my idea, mainly because retrying actions might provoke unforeseen errors.

History 

  • 1.0: My initial thoughts.