“throw” 和“throw ex”之间有区别吗?
throw和throw ex都用于了解异常发生的位置。throw ex重写异常的堆栈跟踪信息,而不管实际在哪里被抛出。
先看以下代码:
输出结果如下所示:
Exception 1:
at throws.Program.DivByZero() in C:\Users\Administrator\source\repos\copy\throw\Program.cs:line 65
at throws.Program.ThrowException1() in C:\Users\Administrator\source\repos\copy\throw\Program.cs:line 40
at throws.Program.Main(String[] args) in C:\Users\Administrator\source\repos\copy\throw\Program.cs:line 12
Exception 2:
at throws.Program.ThrowException2() in C:\Users\Administrator\source\repos\copy\throw\Program.cs:line 57
at throws.Program.Main(String[] args) in C:\Users\Administrator\source\repos\copy\throw\Program.cs:line 24
您可以看到,在异常1中,堆栈跟踪返回到DivByZero()
方法,也就是定位到了65行,而在异常2中则没有。异常2会重置之前捕获到的异常堆栈跟踪信息,在throw ex的位置重新进行堆栈跟踪,也就是堆栈跟踪的起始点不在65行,而在57行。
总结:throw将引发原始异常,并保留其原始堆栈跟踪,它将完整的堆栈信息传播给调用方。throw ex将引发原始异常,但会重置堆栈跟踪,从而破坏所有堆栈跟踪信息,直到遇到下一个catch块为止,这意味着,它从你称为“ Throw ex”的位置排除了堆栈信息 。
因此,我们可以说“ throw”在堆栈跟踪中保持完整的层次结构,并提供有关代码中发生的异常的完整信息。而“ throw ex”假装在写“ throw ex”的行上发生了异常,并删除了包含“ throw ex”表达式的方法上方的所有层次结构。
使用“ throw”语句而不是“ throw ex”是一种好习惯,因为它将为我们提供比“ throw ex”更准确的堆栈信息。