我试图理解 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/