【发布时间】: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