Sie können auch den Ausnahmetyp hinzufügen, bei dem Sie es erneut versuchen möchten. Handelt es sich zum Beispiel um eine Timeout-Ausnahme, die Sie wiederholen möchten? Eine Datenbank-Ausnahme?
RetryForExcpetionType(DoSomething, typeof(TimeoutException), 5, 1000);
public static void RetryForExcpetionType(Action action, Type retryOnExceptionType, int numRetries, int retryTimeout)
{
if (action == null)
throw new ArgumentNullException("action");
if (retryOnExceptionType == null)
throw new ArgumentNullException("retryOnExceptionType");
while (true)
{
try
{
action();
return;
}
catch(Exception e)
{
if (--numRetries <= 0 || !retryOnExceptionType.IsAssignableFrom(e.GetType()))
throw;
if (retryTimeout > 0)
System.Threading.Thread.Sleep(retryTimeout);
}
}
}
Sie können auch feststellen, dass alle anderen Beispiele ein ähnliches Problem mit der Prüfung auf Wiederholungen == 0 haben und entweder unendlich viele Wiederholungen durchführen oder keine Ausnahmen auslösen, wenn ein negativer Wert angegeben wird. Auch Sleep(-1000) wird in den obigen Catch-Blöcken fehlschlagen. Es hängt davon ab, wie "dumm" man die Leute erwartet, aber defensive Programmierung schadet nie.