Sobes.tech
Middle

Was ist der Unterschied zwischen Verwendung von throw und throw ex in C#?

sobes.tech KI

Antwort von AI

Bei Verwendung von throw ex geht der ursprüngliche Aufrufstapel der Ausnahme verloren, während bei einfachem throw dieser erhalten bleibt.

Beispiel:

using System;

public class Example
{
    public static void MethodA()
    {
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Fang in MethodA:");
            Console.WriteLine(ex.StackTrace);
            throw ex; // Verlust von Informationen über den Ort der Ausnahme
        }
    }

    public static void MethodB()
    {
        try
        {
            MethodC();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Fang in MethodB:");
            Console.WriteLine(ex.StackTrace);
            throw; // Beibehaltung der Informationen über den Ort der Ausnahme
        }
    }

    public static void MethodC()
    {
        throw new InvalidOperationException("Test-Ausnahme");
    }

    public static void Main(string[] args)
    {
        Console.WriteLine("Beispiel mit throw ex:");
        try
        {
            MethodA();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Fang in Main (von throw ex):");
            Console.WriteLine(ex.StackTrace);
        }

        Console.WriteLine("\nBeispiel mit throw:");
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Fang in Main (von throw):");
            Console.WriteLine(ex.StackTrace);
        }
    }
}

Die Ausgabe zeigt die Unterschiede im Aufrufstapel, wobei throw ex den Ort angibt, an dem throw ex ausgeführt wurde, während throw den ursprünglichen Ort der Ausnahme angibt (MethodC).

In der Tabelle lassen sich die wichtigsten Unterschiede zusammenfassen:

Merkmal throw ex throw
Aufrufstapel Wird durch den aktuellen Stapel ersetzt Bleibt erhalten (ursprünglicher Stapel)
Ursprungsort Gibt den Ort an, an dem throw ex ausgeführt wurde Gibt den ursprünglichen Ort der Ausnahme an
Verwendung Hauptsächlich zum Ändern des Ausnahmetyps oder zum Hinzufügen von Informationen (obwohl dies keine bewährte Praxis ist) Zum erneuten Auslösen der abgefangenen Ausnahme