Sobes.tech
Middle

Aký je rozdiel medzi použitím throw a throw ex v C#?

sobes.tech AI

Odpoveď od AI

Pri použití throw ex sa stráca pôvodný zásobník volaní výnimky, zatiaľ čo pri použití jednoducho throw sa zachováva.

Príklad:

using System;

public class Example
{
    public static void MethodA()
    {
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Spracovanie v MethodA:");
            Console.WriteLine(ex.StackTrace);
            throw ex; // Stráca informácie o mieste vzniku výnimky
        }
    }

    public static void MethodB()
    {
        try
        {
            MethodC();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Spracovanie v MethodB:");
            Console.WriteLine(ex.StackTrace);
            throw; // Zachováva informácie o mieste vzniku výnimky
        }
    }

    public static void MethodC()
    {
        throw new InvalidOperationException("Testovacia výnimka");
    }

    public static void Main(string[] args)
    {
        Console.WriteLine("Príklad s throw ex:");
        try
        {
            MethodA();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Spracovanie v Main (od throw ex):");
            Console.WriteLine(ex.StackTrace);
        }

        Console.WriteLine("\nPríklad s throw:");
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Spracovanie v Main (od throw):");
            Console.WriteLine(ex.StackTrace);
        }
    }
}

Výstup bude demonštrovať rozdiely v zásobníku volaní, ukazujúc, že throw ex ukazuje na miesto, kde bolo vykonané throw ex, zatiaľ čo throw ukazuje na pôvodné miesto vzniku výnimky (MethodC).

V tabuľke možno predstaviť hlavné rozdiely:

Funkcia throw ex throw
Zásobník volaní Nahrádza sa aktuálnym zásobníkom volaní Zachováva sa (pôvodný zásobník volaní)
Miesto vzniku Ukazuje na miesto, kde bolo vykonané throw ex Ukazuje na pôvodné miesto vzniku výnimky
Použitie Väčšinou na zmenu typu výnimky alebo pridanie informácií (hoci to nie je najlepšia prax) Na opätovnú generáciu zachytenej výnimky