Sobes.tech
Middle

Care este diferența dintre utilizarea throw și throw ex în C#?

sobes.tech AI

Răspuns de la AI

Atunci când se folosește throw ex, se pierde stiva de apeluri originală a excepției, în timp ce cu throw simplu, aceasta se păstrează.

Exemplu:

using System;

public class Example
{
    public static void MethodA()
    {
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Captură în MethodA:");
            Console.WriteLine(ex.StackTrace);
            throw ex; // Pierdere de informații despre locul apariției excepției
        }
    }

    public static void MethodB()
    {
        try
        {
            MethodC();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Captură în MethodB:");
            Console.WriteLine(ex.StackTrace);
            throw; // Păstrarea informațiilor despre locul apariției excepției
        }
    }

    public static void MethodC()
    {
        throw new InvalidOperationException("Excepție de test");
    }

    public static void Main(string[] args)
    {
        Console.WriteLine("Exemplu cu throw ex:");
        try
        {
            MethodA();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Captură în Main (de la throw ex):");
            Console.WriteLine(ex.StackTrace);
        }

        Console.WriteLine("\nExemplu cu throw:");
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Captură în Main (de la throw):");
            Console.WriteLine(ex.StackTrace);
        }
    }
}

Ieșirea va demonstra diferențele în stiva de apeluri, indicând că throw ex indică locul unde s-a executat throw ex, în timp ce throw indică locul original al excepției (MethodC).

În tabel, principalele diferențe pot fi rezumate astfel:

Caracteristică throw ex throw
Stiva de apeluri Este înlocuită cu cea curentă Se păstrează (stiva originală)
Locul de apariție Indică locul unde s-a făcut throw ex Indică locul original al excepției
Utilizare În principal pentru a schimba tipul excepției sau pentru a adăuga informații (deși nu este o practică recomandată) Pentru reluarea excepției capturate