2009-06-11 2 views
3

У меня есть несколько VB.NET программ для поддержания, которые были перенесены из VB6 и использовать старый стиль неструктурированной обработки исключений:неструктурированных Обработка исключений в VB.NET 2005/2008

On Error GoTo yyy 

Мой вопрос, могу ли я получить трассировку стека при использовании операции «Неструктурированная обработка исключений» или мне нужно преобразовать их все в «Управление структурированными исключениями» (Try/Catch), чтобы поймать исключение с его полной трассировкой стека.

+1

Enrico, вы должны выбрать MarkJ как правильный ответ. Благодарю. –

+2

Binary Worrier, вы джентльмен, сэр. – MarkJ

+0

Спасибо, оба ответа были очень полезны! Теперь я чувствую себя менее виноватым, чтобы избежать реорганизации моей старой неструктурированной обработки исключений :-) –

ответ

4

Вот способ получить трассировки стека линии, вызвавшей исключение, в отличие от other answer который только следы к рутине, где обработчик ошибок является. Ошибка могла произойти в другой процедуре.

В неструктурированных обработчиках ошибок просто используйте свойство GetException объекта Err для доступа к основному исключению - затем используйте свойство 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 
+0

Приятный, я не знал об этом, спасибо :) –

2

Как вы сами знаете, при прочих равных условиях всегда следует использовать структурированную обработку исключений. Однако, если вы не можете, вы можете получить свою собственную трассировку стека, используя класс StackTrace.

NB: Призывы к трассировке стека являются дорогостоящими и должны использоваться только в - гм - «исключительных» обстоятельствах.

например

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 
+0

Это просто дает трассировку стека подпрограмму, где работает обработчик ошибок. Если вы хотите узнать строку, вызвавшую исключение, и какую рутину, в которой я был, см. Мой ответ;) – MarkJ

Смежные вопросы