15 de febrero de 2011

Diferencias entre “throw ex” vs “throw”

Con frecuencia en nuestros desarrollos cotidianos en .NET (C#) hacemos uso del try catch finally, pero no siempre lo usamos de forma correcta (yo me incluyo en este grupo), aunque prometo prestar más atención en usos sucesivos.

Hoy quiero hablarles de la diferencia entre usar “throw ex;” o “throw;

La diferencia principal radica en que si usamos “throw ex;” machacaríamos el valor de la propiedad StackTrace (pila de llamadas), propiedad importantísima a la hora de identificar donde se ha originado el error.

Es por ello que mi consejo es usar siempre:

try { //Hacer algo }

catch (Exception ex)

{

  //Hacer algo con la variable ex

  throw;

}

También aconsejo usar esta otra variante, si es que deseamos incluir alguna otra información

try { //Hacer algo }

catch (Exception ex)

{

  //Hacer algo con la variable ex

  throw new Exception(“Información que deseo incluir”, ex);

}

Pero nunca, nunca, nunca, deberíamos usar: “throw ex;” para elevar excepciones.

5 comentarios:

  1. lo q no deberiamos hacer es:

    try { //Hacer algo }
    catch (Exception ex)
    {
    //Hacer algo con la variable ex
    throw ex;
    }

    ?

    y q dicen de esto :

    try { //Hacer algo }
    catch
    {
    //Hacer algo con la variable ex
    throw;
    }

    esta bien? yo lo uso

    ResponderEliminar
  2. Mientras no hagas throw ex... podes soplar botella o lo que quieras en el catch!

    ResponderEliminar
  3. Porque elevar una excepcion dentro del catch? Podria alguien explicarme

    ResponderEliminar
  4. Elevas la excepción siempre y cuando te encuentres en un sub método (si te encuentras en el EventHandler -de un botón por ejemplo- no debes elevar la excepción, sino, mostrar un mensaje al usuario). De todas formas, muchas veces no es necesario colocar TryCatch en los sub métodos. Utilizar un TryCatch solo con un Throw, es lo mismo que no poner TryCatch (de hecho es peor, ya que requiere de mas procesamiento).
    Otra buena práctica siempre es explicitar las posibles excepciones que podrían surgir en el método por cuestiones de rendimiento.

    ResponderEliminar
  5. Relanzar excepciones me ha servido en este escenario:
    Tengo una ventana que llama a una clase dentro de una dll en C#; en esta clase hay un método que revisa si existen ciertos archivos. Si no existen lanza una excepción que es atrapada por la ventana. Si no hay excepción es que los archivo existen y la ventana puede continuar su ejecución, si no existen, entra al catch y la ventana deshabilita los controles que usan estos archivos.

    ResponderEliminar