我有幾個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