Kgn*_*web 1 c# asp.net exception-handling throw
我试图理解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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这给我的输出为:-
未处理的异常:System.DivideByZeroException:试图除以零。在C:\ kgn \ personal \ workspace \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs中的ConsoleApplication1.Calc.Test()中:在C:\ kgn \ personal \ workspace \中的ConsoleApplication1.Program.Main(String [] args)处的第31行ConsoleApplication1 \ ConsoleApplication1 \ Program.cs:第14行
现在,将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
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出为:
未处理的异常:System.DivideByZeroException:试图除以零。在C:\ kgn \ personal \ workspace \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs中的ConsoleApplication1.Calc.Test()中:在C:\ kgn \ personal \ workspace \中的ConsoleApplication1.Program.Main(String [] args)处的第31行ConsoleApplication1 \ ConsoleApplication1 \ Program.cs:第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);
}
Run Code Online (Sandbox Code Playgroud)
该throw;变体将Deeper在堆栈跟踪中向您显示。throw ex;只会显示Test为最深的级别。
| 归档时间: |
|
| 查看次数: |
549 次 |
| 最近记录: |