【问题标题】:Not finding any difference between throw vs throw ex in C#在 C# 中找不到 throw 与 throw ex 之间的任何区别
【发布时间】:2018-02-19 11:09:27
【问题描述】:

我试图了解 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 
        }
    }
 }
}

这给了我输出:-

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

现在将 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
        }
    }
}

这给出的输出为:-

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

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

那么区别在哪里呢?

我同意确实存在差异,但为什么我没有看到呢?我在这里错过了什么?

【问题讨论】:

  • throw 重新抛出捕获的异常。如果你的测试代码也一样——如果有区别会不会很有趣?相反,尝试在 catch 处理程序中抛出另一个异常。
  • 查看 Main 中的堆栈跟踪以比较它们。
  • @L.B,刚刚查看了您评论的帖子,它们仍然相同
  • @BitTickler - 关键是,throw;throw ex; 之间存在 is 区别(请参阅问题中已链接的问题)并且 OP 无法观察他们测试中的差异。

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


【解决方案1】:

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

试试吧:

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 显示为最深层次。

【讨论】:

  • 是的。正确的。但是你能补充一下为什么会这样吗?
  • 我也不确定你是否对这个问题投了反对票。但是你有没有发现我的帖子有什么问题。我读了一些东西,并试图看到它的实际效果,但当它没有时,我分享了所有细节。
  • @Kgn-web - 我假设反对者正在略读这个问题并假设它在询问 关于 两者之间的区别,而不是 为什么 你不能证明差异。我试图在我的第一段中说明原因 - 最初将除以零的位置和 catch 中的 throw 在 IL 中“太接近” - 这样 CLR 无法区分收集堆栈跟踪时的两个位置。通过引入额外的方法,我绝对确保这两个位置应该生成不同的堆栈跟踪。
猜你喜欢
  • 2010-12-22
  • 2020-08-03
  • 2018-08-18
  • 2018-05-30
  • 2013-10-12
  • 1970-01-01
  • 2012-10-01
  • 2018-02-27
相关资源
最近更新 更多