Middle
Jaký je rozdíl mezi použitím throw a throw ex v C#?
sobes.tech AI
Odpověď od AI
Při použití throw ex se ztrácí původní zásobník volání výjimky, zatímco při použití prostého throw zůstává zachován.
Příklad:
using System;
public class Example
{
public static void MethodA()
{
try
{
MethodB();
}
catch (Exception ex)
{
Console.WriteLine("Zachycení v MethodA:");
Console.WriteLine(ex.StackTrace);
throw ex; // Ztráta informací o místě výskytu výjimky
}
}
public static void MethodB()
{
try
{
MethodC();
}
catch (Exception ex)
{
Console.WriteLine("Zachycení v MethodB:");
Console.WriteLine(ex.StackTrace);
throw; // Zachování informací o místě výskytu výjimky
}
}
public static void MethodC()
{
throw new InvalidOperationException("Testovací výjimka");
}
public static void Main(string[] args)
{
Console.WriteLine("Příklad s throw ex:");
try
{
MethodA();
}
catch (Exception ex)
{
Console.WriteLine("Zachycení v Main (od throw ex):");
Console.WriteLine(ex.StackTrace);
}
Console.WriteLine("\nPříklad s throw:");
try
{
MethodB();
}
catch (Exception ex)
{
Console.WriteLine("Zachycení v Main (od throw):");
Console.WriteLine(ex.StackTrace);
}
}
}
Výstup ukáže rozdíly ve zásobníku volání, přičemž throw ex ukazuje místo, kde bylo provedeno throw ex, zatímco throw ukazuje původní místo výskytu výjimky (MethodC).
Tabulka shrnuje hlavní rozdíly:
| Vlastnost | throw ex |
throw |
|---|---|---|
| Zásobník volání | Nahrazen aktuálním zásobníkem | Zachován (původní zásobník) |
| Místo výskytu | Ukazuje místo, kde bylo provedeno throw ex |
Ukazuje původní místo výskytu výjimky |
| Použití | Převážně k změně typu výjimky nebo přidání informací (ačkoliv to není nejlepší praxe) | Pro opětovné vyvolání zachycené výjimky |