2009-06-11 31 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