2009-06-11 43 views
3

我有几个VB.NET程序来维护,已经从VB6移植和使用旧式非结构化异常处理:非结构化异常处理在VB.NET 2005/2008

On Error GoTo yyy 

我的问题是,我仍然可以在使用非结构化异常处理时获得堆栈跟踪,或者是否必须将它们全部转换为结构化异常处理(Try/Catch)以便通过其完整堆栈跟踪来捕获异常。

+1

恩里科,你应该选择MarkJ作为正确的答案。谢谢。 – 2009-06-11 15:08:59

+2

Binary Worrier,你是一位先生先生。 – MarkJ 2009-06-11 16:25:49

+0

谢谢你们俩,这两个答案都非常有用!现在我对避免重构旧的非结构化异常处理感到内疚:-) – 2009-06-12 07:58:54

回答

4

这里有一种方式来获得堆栈跟踪到引起异常,不像只是跟踪到您的错误处理程序是常规的other answer行。错误可能发生在另一个例程中。

在非结构化的错误处理程序,只需要使用Err对象的GetException属性来访问底层异常 - 然后使用StackTrace属性。像这样:

Public Class Form1 

Public Sub New() 

    ' This call is required by the Windows Form Designer.' 
    InitializeComponent() 

    ' Add any initialization after the InitializeComponent() call.' 
    On Error GoTo ErrHandle 

    Call test()   
    Exit Sub 

ErrHandle: 
    MsgBox("Stack trace " & Err.GetException.StackTrace) 
    Exit Sub 

End Sub 


Private Sub test() 
    Call test2() 
End Sub 

Private Sub test2() 
    Dim d(2) As Double 

    MsgBox(d(-1)) 
End Sub 
End Class 
2

正如你所知道的,所有的事情都是平等的,你应该总是使用结构化的异常处理。但是,如果您不能,则可以使用StackTrace类来获得自己的堆栈跟踪。

NB:调用堆栈跟踪代价非常昂贵,只能在 - ahem - '特殊'情况下使用。

e.g

MethodName = (New StackFrame(0)).GetMethod.Name ' Get the current method 
MethodName = (New StackFrame(1)).GetMethod.Name ' Get the Previous method 
MethodName = (New StackFrame(2)).GetMethod.Name ' Get the method before that