我有几个VB.NET程序来维护,已经从VB6移植和使用旧式非结构化异常处理:非结构化异常处理在VB.NET 2005/2008
On Error GoTo yyy
我的问题是,我仍然可以在使用非结构化异常处理时获得堆栈跟踪,或者是否必须将它们全部转换为结构化异常处理(Try/Catch)以便通过其完整堆栈跟踪来捕获异常。
我有几个VB.NET程序来维护,已经从VB6移植和使用旧式非结构化异常处理:非结构化异常处理在VB.NET 2005/2008
On Error GoTo yyy
我的问题是,我仍然可以在使用非结构化异常处理时获得堆栈跟踪,或者是否必须将它们全部转换为结构化异常处理(Try/Catch)以便通过其完整堆栈跟踪来捕获异常。
这里有一种方式来获得堆栈跟踪到引起异常,不像只是跟踪到您的错误处理程序是常规的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
正如你所知道的,所有的事情都是平等的,你应该总是使用结构化的异常处理。但是,如果您不能,则可以使用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
恩里科,你应该选择MarkJ作为正确的答案。谢谢。 – 2009-06-11 15:08:59
Binary Worrier,你是一位先生先生。 – MarkJ 2009-06-11 16:25:49
谢谢你们俩,这两个答案都非常有用!现在我对避免重构旧的非结构化异常处理感到内疚:-) – 2009-06-12 07:58:54