Sobes.tech
Middle

¿Cuál es la diferencia entre usar throw y throw ex en C#?

sobes.tech AI

Respuesta de la IA

Al usar throw ex, se pierde la pila de llamadas original de la excepción, mientras que al usar simplemente throw, se conserva.

Ejemplo:

using System;

public class Example
{
    public static void MethodA()
    {
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Captura en MethodA:");
            Console.WriteLine(ex.StackTrace);
            throw ex; // Pérdida de información sobre el lugar de la excepción
        }
    }

    public static void MethodB()
    {
        try
        {
            MethodC();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Captura en MethodB:");
            Console.WriteLine(ex.StackTrace);
            throw; // Conserva la información del lugar de la excepción
        }
    }

    public static void MethodC()
    {
        throw new InvalidOperationException("Excepción de prueba");
    }

    public static void Main(string[] args)
    {
        Console.WriteLine("Ejemplo con throw ex:");
        try
        {
            MethodA();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Captura en Main (de throw ex):");
            Console.WriteLine(ex.StackTrace);
        }

        Console.WriteLine("\nEjemplo con throw:");
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Captura en Main (de throw):");
            Console.WriteLine(ex.StackTrace);
        }
    }
}

La salida demostrará las diferencias en la pila de llamadas, mostrando que throw ex indica el lugar donde se realizó throw ex, mientras que throw indica el lugar original donde ocurrió la excepción (MethodC).

En la tabla se pueden resumir las diferencias principales:

Característica throw ex throw
Pila de llamadas Se reemplaza por la pila actual Se conserva (pila original)
Lugar de origen Indica el lugar donde se realizó throw ex Indica el lugar original de la excepción
Uso Principalmente para cambiar el tipo de excepción o agregar información (aunque no es la mejor práctica) Para volver a lanzar la excepción capturada