Pregunta

navegar por la red para un mejor manejo de errores en C #, he com a través de la siguiente para las estrategias de implementación. El primero de ellos es natural para mí, mientras que la otra aplicación No estoy seguro de cuáles son sus ventajas?

1)

static void Fault(Action protectedBlock, Action faultHandler)
{ 
    try
    {
        protectedBlock();
    }
    catch
    {
        faultHandler();
        throw;
    }
}

2)

static Action Fault(Action protectedBlock, Action faultHandler)
{
    return () =>
    {
        try
        {
            protectedBlock();
        }
        catch
        {
            faultHandler();
            throw;
        }
    };
}

Es 2) la estrategia principal en el desarrollo de funciones de orden superior en C #?

Y, me pregunto, si un enfoque es más eficiente que el otro.

¿Fue útil?

Solución

El segundo caso es como una fábrica de Acción Faultable. Cuando se pasa en un delegado de lo que quiere hacer, protectedBlock, y un delegado de qué hacer cuando se produce un Exception, faultHandler. Las acciones se devuelven envuelto en una estructura try / catch como Action agregado. Mi problema con estos dos métodos hay Exception es en realidad ser atrapado por lo que cada vez se va a coger su tiro no tiene información sobre la que actuar.

La diferencia en la ejecución entre el 2 es cuando realmente se ejecutan. El primero se ejecutará cuando se llama. El segundo se ejecutará cada vez que el Action devuelto se llama. No creo que la diferencia de eficiencia sería significativo.

Otros consejos

(2) puede estar compuesto además, mientras que (1) se ejecuta sólo. Pero tampoco son exactamente "funcional", como Action no es una función (Comparar con Func<A, R>).

Así, con (2) que podría hacer:

Fault(someAction, Fault(firstTryFaultHandler, lastDitchFaultHandler))();

... comportamiento y se les espera. Eso no funciona con (1)

En C #, enfoque 2 puede ser confuso. Una persona que llama puede utilizar "Fault (a, b);" esperando a y b, posiblemente, a ser llamado. En su lugar, se crea una lambda, regresó y se desecha. En otras palabras, no se hace nada.

En cuanto a la eficiencia, enfoque 2 es un derroche poco si la mayoría de las llamadas son de la forma "Fallo (a, b) ();", es decir, se invoca el lambda inmediatamente. En esta situación, no es necesario un lambda.

Por estas razones, yo preferiría enfoque 1. Si tiene que aplazar la ejecución, se puede introducir un lambda explícita "() => Fallo (a, b)".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top