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

标签 c# asp.net exception throw

我试图理解 throw 和 throw ex 之间的区别。为了辅助我的学习,我对这个理论做了一些研究,这使我找到了以下链接:

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

throw re-throws the exception that was caught, and preserves the stack trace. throw ex throws the same exception, but resets the stack trace to that method.

所以我继续创建了一个演示应用程序,以查看操作上的差异。

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

这给我的输出是:-

Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero. at ConsoleApplication1.Calc.Test() in C:\kgn\personal\workspace\ConsoleApplication1\ConsoleApplication1\Program.cs:line 31 at ConsoleApplication1.Program.Main(String[] args) in C:\kgn\personal\workspace\ConsoleApplication1\ConsoleApplication1\Program.cs:line 14

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

这给出了输出:-

Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero. at ConsoleApplication1.Calc.Test() in C:\kgn\personal\workspace\ConsoleApplication1\ConsoleApplication1\Program.cs:line 31 at ConsoleApplication1.Program.Main(String[] args) in C:\kgn\personal\workspace\ConsoleApplication1\ConsoleApplication1\Program.cs:line 14

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

那么区别在哪里呢?

我同意确实存在差异,但为什么我看不到它?我错过了什么?

最佳答案

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

改为尝试:

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; 变体将在堆栈跟踪中向您显示更深入throw ex; 只会将 Test 显示为最深的级别。

关于c# - 在 C# 中找不到 throw 与 throw ex 之间的任何区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46151796/

相关文章:

Java:从文件读取时扫描仪不接受 try-catch 类错误

C# eBayAPIInterfaceClient 错误 : The web service eBayAPI is not properly configured or not found and is disabled

c# - 我可以在 Controller 的构造函数中访问 User.Identity.Name 吗?如果不是,最佳实践是什么?

c# - 为什么.NET Framework 中存在两个相同的接口(interface)?

java - 无法序列化

c# - 当数据库中的字段不允许为空时如何处理异常

c# - 我可以知道在 Visual Studio 2015 中调试期间执行的最后一条语句吗?

c# - ASP.net MVC 获取当前 View 引擎

c# - C# 中是否有任何方法或方式可以在 LIFO 的基础上添加 List<T> 中的项目?

使用正则表达式进行 JavaScript 验证不起作用