throw مجددا خطا را صادر میکند با همان StackTrace قبلی. دقیقا خطای صادر شده را مجددا صادر میکند.

اما اگر از throw ex استفاده کنید بازم هم همان خطای قبلی را صادر میکند اما با یک تفاوت, StackTrace را ریست میکند!. برای مثال در کد زیر در متد DoSomething یک عملیات تقسیم بر صفر انجام میدهیم که باعث بروز خطا شود ( از throw ex استفاده کرده ایم ). سپس در متد اصلی Main وقتی که وارد قسمت catch میشود و StackTrace را نمایش میدهد, خطی که خطا صادر شده است را داخل قسمت catch نشان میدهد یعنی شماره خط اصلی که عملیات تقسیم بر صفر صورت گرفته است را نمایش نمیدهد.

class Program
{
    public static void Main()
    {
        try
        {
            DoSomething();// Line 10
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.StackTrace);// Line 14
        }
    }
    public static void DoSomething()
    {
        try
        {
            int number = 20;
            int division = 0;
            Console.WriteLine(number / division);// Line 23
        }
        catch (Exception ex)
        {
            throw ex;// Line 27
        }   
    }
}

اگر برنامه را اجرا کنید پیغام زیر را در صفحه کنسول مشاهده میکنید:

at Exception.Program.DoSomething() in C:\Users\Farhad\source\repos\Exception\Program.cs:line 27
   at Exception.Program.Main() in C:\Users\Farhad\source\repos\Exception\Program.cs:line 10

در صفحه کنسول خط 27 را مشاهده میکنید که خط 27 داخل قسمت catch قرار دارد. اما اگر به جای throw ex از همان throw استفاده کنید, در صفحه کنسول محل دقیق خطای صادر شده را مشاهده میکنید. اگر متد DoSomething را به صورت زیر تغییر دهید و مجدد برنامه را اجرا کنید, محل دقیق خطا را در StackTrace مشاهده میکنید:

public static void DoSomething()
{
    try
    {
        int number = 20;
        int division = 0;
        Console.WriteLine(number / division);// Line 23
    }
    catch (Exception)
    {
        throw;// Line 27
    }   
}

صفحه کنسول:

at Exception.Program.DoSomething() in C:\Users\Farhad\source\repos\Exception\Program.cs:line 23
   at Exception.Program.Main() in C:\Users\Farhad\source\repos\Exception\Program.cs:line 10

بنابراین بهتر است از throw استفاده کنیم و تا جایی که ممکن است از throw ex استفاده نکنیم زیرا StackTrace را ریست میکند و محل دقیق خطای صادر شده معلوم نیست.

;)