Sobes.tech
Middle

Quelle est la différence entre utiliser throw et throw ex en C#?

sobes.tech IA

Réponse de l'IA

Lors de l'utilisation de throw ex, la pile d'appels d'origine de l'exception est perdue, tandis qu'avec simplement throw, elle est conservée.

Exemple:

using System;

public class Example
{
    public static void MethodA()
    {
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Capture dans MethodA:");
            Console.WriteLine(ex.StackTrace);
            throw ex; // Perte d'informations sur le lieu de l'exception
        }
    }

    public static void MethodB()
    {
        try
        {
            MethodC();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Capture dans MethodB:");
            Console.WriteLine(ex.StackTrace);
            throw; // Conservation des informations sur le lieu de l'exception
        }
    }

    public static void MethodC()
    {
        throw new InvalidOperationException("Exception de test");
    }

    public static void Main(string[] args)
    {
        Console.WriteLine("Exemple avec throw ex:");
        try
        {
            MethodA();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Capture dans Main (de throw ex):");
            Console.WriteLine(ex.StackTrace);
        }

        Console.WriteLine("\nExemple avec throw:");
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Capture dans Main (de throw):");
            Console.WriteLine(ex.StackTrace);
        }
    }
}

La sortie illustrera les différences dans la pile d'appels, montrant que throw ex indique le lieu où throw ex a été effectué, tandis que throw indique le lieu d'origine de l'exception (MethodC).

Le tableau peut résumer les principales différences:

Caractéristique throw ex throw
Pile d'appels Est remplacée par la pile courante Est conservée (pile d'origine)
Lieu d'origine Indique le lieu où throw ex a été effectué Indique le lieu d'origine de l'exception
Utilisation Principalement pour changer le type d'exception ou ajouter des informations (bien que ce ne soit pas une bonne pratique) Pour relancer l'exception capturée