Sobes.tech
Middle

Jaka jest różnica między używaniem throw a throw ex w C#?

sobes.tech AI

Odpowiedź od AI

Użycie throw ex powoduje utratę oryginalnego stosu wywołań wyjątku, podczas gdy użycie samego throw go zachowuje.

Przykład:

using System;

public class Example
{
    public static void MethodA()
    {
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Przechwycenie w MethodA:");
            Console.WriteLine(ex.StackTrace);
            throw ex; // Utrata informacji o miejscu wystąpienia wyjątku
        }
    }

    public static void MethodB()
    {
        try
        {
            MethodC();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Przechwycenie w MethodB:");
            Console.WriteLine(ex.StackTrace);
            throw; // Zachowanie informacji o miejscu wystąpienia wyjątku
        }
    }

    public static void MethodC()
    {
        throw new InvalidOperationException("Testowy wyjątek");
    }

    public static void Main(string[] args)
    {
        Console.WriteLine("Przykład z throw ex:");
        try
        {
            MethodA();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Przechwycenie w Main (od throw ex):");
            Console.WriteLine(ex.StackTrace);
        }

        Console.WriteLine("\nPrzykład z throw:");
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Przechwycenie w Main (od throw):");
            Console.WriteLine(ex.StackTrace);
        }
    }
}

Wynik pokaże różnice w stosie wywołań, wskazując, że throw ex wskazuje miejsce, w którym wykonano throw ex, podczas gdy throw wskazuje miejsce pierwotnego wystąpienia wyjątku (MethodC).

Tabela podsumowuje główne różnice:

Cecha throw ex throw
Stos wywołań Zastępowany przez bieżący stos Zachowany (oryginalny stos)
Miejsce wystąpienia Wskazuje miejsce, gdzie wykonano throw ex Wskazuje pierwotne miejsce wystąpienia wyjątku
Zastosowanie Głównie do zmiany typu wyjątku lub dodania informacji (chociaż nie jest to najlepsza praktyka) Do ponownego rzucenia przechwyconego wyjątku