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 |