在C#中找不到throw与throw ex之间有什么区别

Kgn*_*web 1 c# asp.net exception-handling throw

我试图理解throw和throw ex之间的区别。为了帮助我的学习,我对理论进行了一些研究,将我带到以下链接:

总结以上几点,区别是:

throw重新引发捕获的异常,并保留堆栈跟踪。throw ex引发相同的异常,但是将堆栈跟踪重置为该方法。

因此,我继续为同一个应用程序创建了一个演示应用程序,以了解操作上的差异。

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Calc c = new Calc();
        c.Test();
    }
}

class Calc
{
    public void Test()
    {
        try
        {
            int a = 10;
            int b = 10;
            int c = 10 / (a - b);
        }
        catch (Exception ex)
        {

            throw; //throw statement 
        }
    }
 }
}
Run Code Online (Sandbox Code Playgroud)

这给我的输出为:-

未处理的异常:System.DivideByZeroException:试图除以零。在C:\ kgn \ personal \ workspace \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs中的ConsoleApplication1.Calc.Test()中:在C:\ kgn \ personal \ workspace \中的ConsoleApplication1.Program.Main(String [] args)处的第31行ConsoleApplication1 \ ConsoleApplication1 \ Program.cs:第14行

现在,将throw替换为throw ex。

 class Calc
{
    public void Test()
    {
        try
        {
            int a = 10;
            int b = 10;
            int c = 10 / (a - b);
        }
        catch (Exception ex)
        {

            throw ex; // throw ex statement
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出为:

未处理的异常:System.DivideByZeroException:试图除以零。在C:\ kgn \ personal \ workspace \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs中的ConsoleApplication1.Calc.Test()中:在C:\ kgn \ personal \ workspace \中的ConsoleApplication1.Program.Main(String [] args)处的第31行ConsoleApplication1 \ ConsoleApplication1 \ Program.cs:第14行

如果我看到异常消息,它们都是相同的。

那么区别在哪里呢?

我当然同意有区别,但是为什么我看不到呢?我在这里想念什么?

Dam*_*ver 5

您没有看到的问题是,您正在使用的可能的投掷位置非常靠近,以至于在收集堆栈跟踪信息时无法区分它们。

请尝试:

public void Test()
{
  try
  {
    Deeper();
  }
  catch (Exception ex)
  {

    throw; //throw statement 
  }
}

private static void Deeper()
{
  int a = 10;
  int b = 10;
  int c = 10 / (a - b);
}
Run Code Online (Sandbox Code Playgroud)

throw;变体将Deeper在堆栈跟踪中向您显示。throw ex;只会显示Test为最深的级别。