假设我有以下构造:
Try
Dim f As FileInfo = Nothing
f.Delete()
... some other stuff...
Catch ex as Exception
Throw
End Try在这个简单的例子中,f.Delete会抛出一个NullReferenceException。
Throw语句而不是f.Delete()行?f.Delete()作为问题的来源?发布于 2015-06-11 20:32:52
1.为什么这个异常的StackTrace中的问题行指向抛出语句而不是f.Delete()行?
这取决于您正在查看的堆栈跟踪:由重新抛出(在catch块中的Throw )生成的跟踪,还是通过捕获第一个异常生成的跟踪?
在Catch ex As Exception行上设置一个断点,并使用调试器检查ex;您将看到指向f.Delete()的堆栈跟踪。
Throw的意思是“重新抛出”,即原始堆栈跟踪将被保留.但是,对于相同的方法调用,您不会在堆栈跟踪中获得两个条目:如果异常在最初导致异常的同一方法中被重新抛出,堆栈跟踪将只包含指向最终重抛.的条目。
2.如何保持Try/Catch,但将正确的堆栈跟踪指向f.Delete()作为问题的来源?
Catch … When <boolean-expression>)来决定是否能够在捕获异常之前实际处理异常,而不是重新抛出。如果您能够确定在捕获它之前,重新抛出应该是不必要的,并且堆栈跟踪不会被修改。f.Delete()放在另一种方法中。这样,它就可以在堆栈跟踪中获得自己的堆栈帧/行,并且不会被重新Throw覆盖。(或者,不要仅仅为了重新抛出而捕获异常。)
发布于 2015-06-11 21:31:27
我想这也能给出正确的异常(至少在“内部”异常中是这样):
Try
Dim f As FileInfo = Nothing
f.Delete()
... some other stuff...
Catch ex as Exception
Throw New Exception("Failed in Method X", ex)
End Tryhttps://stackoverflow.com/questions/30790829
复制相似问题