如何在VB中保留堆栈跟踪的同时抛出现有异常?
问题描述:
如果我有一个现有的异常对象(我是而不是在一个catch块中,我只是碰巧给了一个异常对象),有什么方法(重新)抛出它,同时保留它的堆栈跟踪?如何在VB中保留堆栈跟踪的同时抛出现有异常?
询问的上下文是我正在写一个RunWorkerCompleted处理程序。如果在运行后台任务时发生错误,那么这将显示在RunWorkerCompletedEventArgs的Error属性中。为了保持代码简单,我希望使用相同的错误处理代码来捕获此错误,或者在处理程序期间稍后发生任何错误。这意味着我需要这样的代码:
Private Sub OnDone(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
Try
If e.Error IsNot Nothing Then Throw e.Error ' But how do I keep its stack trace?
' do other work that might throw an exception
Catch ex As Exception
' handle any exceptions
End Try
End Sub
我不认为这里使用的InnerException(即说像抛出新的异常(前))会工作,因为当时我有我的catch块问题无法知道它应该处理的异常是外部还是内部异常。
*似乎有各种类似的问题,但我还没有找到任何描述这种特殊情况的东西。
答
.NET 4.5中有一项功能可以满足您的需求。但既然现在不能帮你,你唯一的选择就是把它换成另一个例外。
为什么你需要重新抛出它?你能不能在if语句中为这个特定的异常写错误处理代码,从而保存堆栈跟踪? –
If语句中异常的错误处理代码与将在Catch块中执行的错误处理代码完全相同,因此虽然我可以在两个地方重复代码,但这些代码都不是很理想 - 会使代码更难读取。 – PhantomDrummer
在两个位置调用的单独函数中有错误处理代码的情况如何?或者,有一个错误变量和一个foundError变量,并将它们设置为if和catch语句,然后在try-catch块之后处理错误。 –