Middle
Qual é a diferença entre usar throw e throw ex em C#?
sobes.tech IA
Resposta da IA
Ao usar throw ex, a pilha de chamadas original da exceção é perdida, enquanto que ao usar simplesmente throw, ela é mantida.
Exemplo:
using System;
public class Example
{
public static void MethodA()
{
try
{
MethodB();
}
catch (Exception ex)
{
Console.WriteLine("Captura em MethodA:");
Console.WriteLine(ex.StackTrace);
throw ex; // Perda de informação sobre o local da exceção
}
}
public static void MethodB()
{
try
{
MethodC();
}
catch (Exception ex)
{
Console.WriteLine("Captura em MethodB:");
Console.WriteLine(ex.StackTrace);
throw; // Conserva a informação do local da exceção
}
}
public static void MethodC()
{
throw new InvalidOperationException("Exceção de teste");
}
public static void Main(string[] args)
{
Console.WriteLine("Exemplo com throw ex:");
try
{
MethodA();
}
catch (Exception ex)
{
Console.WriteLine("Captura em Main (de throw ex):");
Console.WriteLine(ex.StackTrace);
}
Console.WriteLine("\nExemplo com throw:");
try
{
MethodB();
}
catch (Exception ex)
{
Console.WriteLine("Captura em Main (de throw):");
Console.WriteLine(ex.StackTrace);
}
}
}
A saída demonstrará as diferenças na pilha de chamadas, mostrando que throw ex indica o local onde foi feito throw ex, enquanto que throw indica o local original da exceção (MethodC).
Na tabela, podem-se resumir as principais diferenças:
| Característica | throw ex |
throw |
|---|---|---|
| Pilha de chamadas | Substituída pela pilha atual | Mantida (pilha original) |
| Local de origem | Indica o local onde throw ex foi feito |
Indica o local original da exceção |
| Uso | Principalmente para alterar o tipo de exceção ou adicionar informações (embora não seja uma prática recomendada) | Para relançar a exceção capturada |