Sobes.tech
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