我试图理解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
如果我看到异常消息,它们都是相同的。
那么区别在哪里?
我肯定肯定会有所不同,但为什么我没有看到它?我在这里错过了什么?
答案 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;
变体将在堆栈跟踪中显示Deeper
。 throw ex;
只会将Test
显示为最深层。
答案 1 :(得分:0)
抛出语法:
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;
}
}