Reduciendo el código duplicado de manejo de errores en C #?

Nunca he estado del todo contento con la forma en que funciona el manejo de excepciones, hay muchas excepciones y trucos de prueba / captura a la mesa (desenrollado de pila, etc.), pero parece romper mucho el modelo OO en el proceso.

De todos modos, aquí está el problema:

Supongamos que tiene alguna clase que envuelve o incluye operaciones de E / S de archivos en red (por ejemplo, leer y escribir en algún archivo en alguna ruta UNC particular en algún lugar). Por diversas razones, no desea que esas operaciones de E / S falle, por lo que si detecta que fallan, las reintenta y las sigue reintentando hasta que tengan éxito o llegue a un tiempo de espera. Ya tengo una clase RetryTimer conveniente que puedo instanciar y usar para suspender el hilo actual entre los reintentos y determinar cuándo ha transcurrido el período de tiempo de espera, etc.

El problema es que tiene un montón de operaciones de E / S en varios métodos de esta clase, y necesita envolver cada una de ellas en la lógica de prueba-captura / reintento.

Aquí hay un fragmento de código de ejemplo:

RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
bool success = false;
while (!success)
{
    try
    {
        // do some file IO which may succeed or fail
        success = true;
    }
    catch (IOException e)
    {
        if (fileIORetryTimer.HasExceededRetryTimeout)
        {
            throw e;
        }
        fileIORetryTimer.SleepUntilNextRetry();
    }
}

Entonces, ¿cómo evita duplicar la mayor parte de este código para cada operación de E / S de archivos en toda la clase? Mi solución fue usar bloques de delegados anónimos y un solo método en la clase que ejecutó el bloque de delegados que se le pasó. Esto me permitió hacer cosas como esta en otros métodos:

this.RetryFileIO( delegate()
    {
        // some code block
    } );

Me gusta esto un poco, pero deja mucho que desear. Me gustaría saber cómo otras personas resolverían este tipo de problema.

Respuestas a la pregunta(4)

Su respuesta a la pregunta