Try-Catch – ¿Por qué y para qué usas throw?

Si alguna vez has encontrado la sentencia throw dentro de un Try-Catch y este comportamiento se repite por toda la aplicación entonces te recomiendo que leas este post:
public void Tarea()
{
    try
    {
        //Ocurre una excepción
    }
    catch (Exception ex)
    {
        throw;
    }
}

Si al revisar el código encuentras la sentencia throw dentro de un Try-Catch en varios lugares mantente alerta ya que es un indicador de un [posible] Code Smell lo que quiere decir que hay un problema en el sistema. Pero algunos se pueden preguntar:

¿Si no uso throw la excepción se pierde?

Respuesta: FALSO

Una excepción siempre se propaga hasta que alguien la controle, ya sea que se encuentre en la misma clase u otra. Por lo tanto con estos dos ejemplos tenemos el mismo resultado:

public void Tarea()
{
    try
    {
        //Ocurre una excepción
    }
    catch (Exception ex)
    {
        throw;
    }
}
public void Tarea()
{
    //Ocurre una excepción
}

El código que llame al método Tarea deberá implementar un Try-catch si desea capturar y manejar el error, de otra forma debe dejar que le excepción se propague hasta que alguien la controle.

¿Pero qué problemas pueden ocurrir si uso throw dentro de un Try-Catch?

Respuesta: Pueden ocurrir muchos problemas.

Los motivos que conozco son los siguientes:

  • Genera mucho código repetido, recuerden el principio DRY (Don’t repeat yourself).
  • Dificulta la lectura debido a que agrega más líneas de código.
  • Al capturar y volver a lanzar una excepción innecesariamente puede disminuir el rendimiento dependiendo del caso.

¿Entonces es malo usar un throw dentro de un Try-Catch?

La respuesta es depende como lo uses, las cosas no son malas por naturaleza los malos son las personas que lo usan. Solo conozco dos casos en donde si se debe usar y la idea principal es si le agregas valor. Por valor me refiero a que hagas cosas adicionales dentro del Catch antes de devolver el error.

Si antes de devolver una excepción necesitas realizar algo como: registrar un log o enviar una notificación, entonces es un caso valido.

NOTA: La opción a tomar depende de cómo ha sido diseñada y configurada la aplicación para el manejo de errores.

public void Tarea()
{
    try
    {
        //Logica
    }
    catch (Exception ex)
    {
        //Envio Mail
        //Log de errores
        //Etc
        throw;
    }
}

Otro caso valido es cuando devuelves otro tipo de excepción, por ejemplo: una excepción personalizada o una excepción del sistema, puede ser un ApplicationException, agregando información adicional al error ocurrido.

public void Tarea(int idUsuario)
{
    try
    {
        //Logica
    }
    catch (Exception ex)
    {
        throw new ApplicationException(string.Format("IdUsuario:{0}",idUsuario),ex);
    }
}
public void Tarea(Parametro parametro)
{
    try
    {
        //Logica
    }
    catch (DirectoryServicesCOMException ex)
    {
        if (ex.ErrorCode == -2147023570)
        {
            throw new ExcepcionPersonalizada("Información adicional", ex);
        }
        //Se devuelve la excepción original
        throw;
    }
}

NOTA: En todos los casos no es valido hacer esto, también depende si tiene algún propósito cambiar el tipo de excepción.

En conclusión, usar throw dentro de un Try-Catch sin una razón valida no es recomendable. Como vemos puede traer problemas de diseño y sobre todo de rendimiento. En caso se quiera manejar y propagar el error se puede implementar un throw dentro de un Try-Catch, pero como mencione anteriormente todo depende de la estrategia de manejo de errores que implemente cada aplicación.

En este post hablo de la diferencia entre usar throw y throw ex dentro de un Try-Catch.

Si te gusto este post entonces por favor ayúdame a difundirlo y logremos que el conocimiento se expanda, para lograr esto dale me gusta, compártelo en tus redes sociales a tus amigos o suscríbete a mi canal RSS, Gracias :).

Referencias:

Metal Tip:

Este artículo lo escribí escuchando la canción The Book of Heavy Metal de la banda Dream Evil de Suecia, les comparto el enlace.

Happy coding and Stay Heavy lml

Anuncios

3 comentarios en “Try-Catch – ¿Por qué y para qué usas throw?

  1. Buen post! Quiero agregar un punto que para mi es uno de los mas importantes, cuando usas un throw se pierde el origen de la excepcion y al volver a lanzar la excepcion el StackTrace indica como origen la linea del ultimo throw cuando no necesariamente fué así, y se pierde la traza.

    Me gusta

  2. ¡Excelente artículo!
    Estaba investigando sobre el manejo de excepciones en una arquitectura n-capas y llegué por aquí. Por cierto, ¿podrías escribir sobre ello? Todavía no he encontrado un artículo que ejemplifique bien este tema. Encontré muchas referencias a “Microsoft Enterprise Library”, pero no sé si es la mejor forma de empezar ¿qué sugerirías?

    Saludos!

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s