Middle
Qual è la differenza tra usare throw e throw ex in C#?
sobes.tech AI
Risposta dell'AI
Utilizzando throw ex, la pila di chiamata originale dell'eccezione viene persa, mentre con semplicemente throw, viene mantenuta.
Esempio:
using System;
public class Example
{
public static void MethodA()
{
try
{
MethodB();
}
catch (Exception ex)
{
Console.WriteLine("Cattura in MethodA:");
Console.WriteLine(ex.StackTrace);
throw ex; // Perdita di informazioni sul luogo dell'eccezione
}
}
public static void MethodB()
{
try
{
MethodC();
}
catch (Exception ex)
{
Console.WriteLine("Cattura in MethodB:");
Console.WriteLine(ex.StackTrace);
throw; // Conservazione delle informazioni sul luogo dell'eccezione
}
}
public static void MethodC()
{
throw new InvalidOperationException("Eccezione di test");
}
public static void Main(string[] args)
{
Console.WriteLine("Esempio con throw ex:");
try
{
MethodA();
}
catch (Exception ex)
{
Console.WriteLine("Cattura in Main (da throw ex):");
Console.WriteLine(ex.StackTrace);
}
Console.WriteLine("\nEsempio con throw:");
try
{
MethodB();
}
catch (Exception ex)
{
Console.WriteLine("Cattura in Main (da throw):");
Console.WriteLine(ex.StackTrace);
}
}
}
L'output dimostrerà le differenze nello stack di chiamata, mostrando che throw ex indica il punto in cui è stato eseguito throw ex, mentre throw indica il punto originale dell'eccezione (MethodC).
Nella tabella si possono riassumere le principali differenze:
| Caratteristica | throw ex |
throw |
|---|---|---|
| Stack di chiamata | Sostituito con lo stack corrente | Conservato (stack originale) |
| Luogo di origine | Indica il luogo in cui è stato eseguito throw ex |
Indica il luogo originale dell'eccezione |
| Uso | Principalmente per cambiare il tipo di eccezione o aggiungere informazioni (anche se non è una buona pratica) | Per rilanciare l'eccezione catturata |