如何在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块问题无法知道它应该处理的异常是外部还是内部异常。

*似乎有各种类似的问题,但我还没有找到任何描述这种特殊情况的东西。

+0

为什么你需要重新抛出它?你能不能在if语句中为这个特定的异常写错误处理代码,从而保存堆栈跟踪? –

+0

If语句中异常的错误处理代码与将在Catch块中执行的错误处理代码完全相同,因此虽然我可以在两个地方重复代码,但这些代码都不是很理想 - 会使代码更难读取。 – PhantomDrummer

+0

在两个位置调用的单独函数中有错误处理代码的情况如何?或者,有一个错误变量和一个foundError变量,并将它们设置为if和catch语句,然后在try-catch块之后处理错误。 –

.NET 4.5中有一项功能可以满足您的需求。但既然现在不能帮你,你唯一的选择就是把它换成另一个例外。