2012-09-10 21 views
5

Duplicar posible:
How slow are .NET exceptions?Manejo de excepciones. ¿Cuánto tiempo tarda la captura?

¿Hay una sobrecarga para lanzar una excepción y la captura de inmediato? ¿Hay alguna diferencia entre este

void DoSomething(object basic) 
{ 
    try 
    { 
     if (basic == null) 
     throw new NullReferenceException("Any message"); 
     else 
     { 
     //... 
     } 
    } 
    catch (Exception error) 
    { 
     _logger.WriteLog(error); 
    } 
} 

y esto (excepción aquí no tiramos):

void DoSomething(object basic) 
{ 
    try 
    { 
     if (basic == null) 
     { 
      _logger.WriteLog(new NullReferenceException("Any message"); 
      return; 
     } 
     else 
     { 
     ... 
     } 
    } 
    catch (Exception error) 
    { 
     _logger.WriteLog(error); 
    } 
} 

¿El segundo fragmento de ser más rápido, o no?

También quiero saber por qué una solución es más rápida que otra.

+0

(new NullReferenceException ("Cualquier mensaje");) es mi error de impresión. –

+2

Siempre puede editar su pregunta para arreglarla (haga clic en el enlace 'edit') – dasblinkenlight

+0

Si desea saber cuál es más rápido, y ya tiene dos fragmentos de código válidos, ¿por qué no ejecutar ambos (muchos miles de veces) y encontrar por ti mismo? – Servy

Respuesta

4

Las excepciones son más lentos que el resto del flujo del programa, pero no en la medida en que se debe evitar por razones de rendimiento. Sin embargo, no están destinados a ser utilizados para el flujo del programa. En su situación, tiene una alternativa muy válida que es mejor que usar excepciones. Cuando puede predecir una situación y manejarla adecuadamente sin excepciones, siempre haga eso. Además, no use excepciones en el flujo de programa normal como una conveniencia.

Use excepciones cuando tenga una situación excepcional imprevista que no pueda manejar directamente.

+0

Gracias. Primer fragmento que encontré en el proyecto y creo que es mejor hacerlo sin tirar la excepción y preguntar aquí. –

+0

¿Qué opinas sobre el uso de try finalmente para el flujo de programa, cuando en el bloque de try return se coloca, y finalmente bloquea el código general, que debe ejecutarse siempre, colocado? –

+0

@DaniilGrankin, 'try' /' finally' es realmente una construcción importante para ejecutar código, generalmente código de limpieza, independientemente de cómo se genere (a partir de retorno, fallido o excepción). En general, solo el código de limpieza debe ejecutarse en un 'finally' y desea asegurarse de que' finally' nunca arroje una excepción. Con esas cosas en mente, siempre use 'try' /' finally' cuando sea apropiado. –

0

Entiendo que Throw tiene mucho más sobrecarga que try/catch does. Con eso me refiero a que hay un poco de sobrecarga para tener un try/catch, pero hay una pequeña sobrecarga una vez que realmente tienes que atrapar una excepción. En muchos programas, las dos opciones que muestre estarán bien, pero si está intentando realmente crear un perfil de su código, será más rápido sin el lanzamiento. Un par de otras preguntas vale la pena mirar:

Under C# how much of a performance hit is a try, throw and catch block

What is the real overhead of try/catch in C#?

0

En este caso, creo que la segunda opción es más rápida, pero como dijo @Samuel Neff Las excepciones son muy lentas. Sin embargo, cuando estaba leyendo un artículo de Jon Skeet sobre excepciones, encontré un artículo interesante por Krzysztof Cwalina: Design Guidelines Update: Exception Throwing., que explica cuándo debemos y no debemos usar excepciones. De hecho leerlo me encontré un punto importante dice:

1.2 Excepciones y rendimiento:

Una preocupación común relacionado con excepciones es que si las excepciones son utiliza para el código que falla rutinariamente, el rendimiento de la implementación será inaceptable. Esta es una preocupación muy válida. Cuando un miembro lanza una excepción, su rendimiento puede ser órdenes de de magnitud más lenta. Sin embargo, es posible obtener un buen rendimiento respetando estrictamente las pautas de excepción que no permiten utilizando códigos de error. Dos patrones descritos en esta sección sugieren maneras para hacer esto.

  • No códigos utilización de error debido a la preocupación de que las excepciones podrían afectar negativamente al rendimiento.
Cuestiones relacionadas