在C#中找不到throw vs throw ex之间的任何区别

时间:2017-09-11 09:00:12

标签: c# asp.net exception-handling throw

我试图理解throw& amp;和抛出前为了帮助我学习,我对这个理论进行了一些研究,这使我得到了以下链接:

总结以上几点,不同之处在于: -

  

抛出重新抛出捕获的异常,并保留堆栈   跟踪。 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 
        }
    }
 }
}

这给出了输出: -

  

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

现在用throw ex。

替换了throw
 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
        }
    }
}

这将输出为: -

  

未处理的异常:System.DivideByZeroException:试图划分   零。在ConsoleApplication1.Calc.Test()中   C:\ KGN \个人\工作区\ ConsoleApplication1 \ ConsoleApplication1 \的Program.cs:行   31在ConsoleApplication1.Program.Main(String [] args)中   C:\ KGN \个人\工作区\ ConsoleApplication1 \ ConsoleApplication1 \的Program.cs:行   14

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

那么区别在哪里?

我肯定肯定会有所不同,但为什么我没有看到它?我在这里错过了什么?

2 个答案:

答案 0 :(得分:4)

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

尝试改为:

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);
}

throw;变体将在堆栈跟踪中显示Deeperthrow ex;只会将Test显示为最深层。

答案 1 :(得分:0)

  • throw重新引发捕获的异常,并保留堆栈跟踪。
  • throw ex会抛出相同的异常,但是会将堆栈跟踪重置为该方法。除非您想重置堆栈跟踪
  • 通常,throw是更好的选择,因为您可以看到异常的起源。

抛出语法:

try
{
// do some operation that can fail
}
catch (Exception ex)
{
// do some local cleanup
throw;
}

抛出语法:

try
{
// do some operation that can fail
}
catch (Exception ex)
{
// do some local cleanup
throw ex;
}
}