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 |