Sobes.tech
Middle

Koja je razlika između korišćenja throw i throw ex u C#?

sobes.tech АИ

Одговор од АИ

Када користите throw ex, губи се оригинални стек позива изузетка, а када користите једноставно throw, он се задржава.

Пример:

using System;

public class Example
{
    public static void MethodA()
    {
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Обрада у MethodA:");
            Console.WriteLine(ex.StackTrace);
            throw ex; // губи информације о месту извршења изузетка
        }
    }

    public static void MethodB()
    {
        try
        {
            MethodC();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Обрада у MethodB:");
            Console.WriteLine(ex.StackTrace);
            throw; // задржава информације о месту извршења изузетка
        }
    }

    public static void MethodC()
    {
        throw new InvalidOperationException("Тест изузетак");
    }

    public static void Main(string[] args)
    {
        Console.WriteLine("Пример са throw ex:");
        try
        {
            MethodA();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Обрада у Main (од throw ex):");
            Console.WriteLine(ex.StackTrace);
        }

        Console.WriteLine("\nПример са throw:");
        try
        {
            MethodB();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Обрада у Main (од throw):");
            Console.WriteLine(ex.StackTrace);
        }
    }
}

Излаз ће показати разлике у стеку позива, показујући да throw ex указује на место где је извршен throw ex, док throw указује на оригинално место изазивања изузетка (MethodC).

У табели се могу представити главне разлике:

Карактеристика throw ex throw
Стек позивања Замењује се тренутним стеком позива Сачуван је (првобитни стек позива)
Место изазивања Указује на место где је извршен throw ex Указује на првобитно место изазивања изузетка
Примена Углавном за промену типа изузетка или додавање информација (иако то није најбоља пракса) За поновно генерисање прекинутог изузетка