2009-05-23 3 views
1

Есть ли способ в VB.NET для вывода текущего номера строки в исходном коде? Например:Номера строк вывода

Try 
    ' The following line will purposly cause an error 
    Dim BigNum As Int64 
    Dim LittleNum As Int16 = CShort(BigNum) 
Catch ex As Exception 
    Dim LineNumber As Integer = <linenumber> ' How do I do this? 
    MessageBox.Show("Error in source code. Line: " + LineNumber) 
End Try 

Есть ли способ, чтобы заполнить переменную LINENUMBER в приведенном выше примере с фактическим номером строки в исходном коде, который вызвал ошибку?

ответ

0

Номер строки будет уже в трассировке стека Исключения. Я думаю, что это даже показывает в простой ex.ToString.

5

Это должно сделать работу:

Dim stackTrace = New System.Diagnostics.StackTrace(ex) 
Dim stackFrame = stackTrace.GetFrame(stackTrace.FrameCount - 1) 
Dim lineNumber = stackFrame.GetFileLineNumber() 

Обратите внимание, что GetFrame(stackTrace.FrameCount - 1)) получает первый кадр помещается в стек. В этом случае это кадр, содержащий текущий блок try-catch, который вы хотите. Смотрите MSDN docs для получения дополнительной информации)

+0

спасибо. Это похоже на то, что я искал! – 2009-05-23 21:16:32

+0

Рад помочь. Если у вас нет каких-либо дальнейших запросов, не могли бы вы принять его в качестве ответа? – Noldorin

+0

Я попробовал, но StackFrame не содержит информации (GetFileName возвращает Nothing, а GetFileLineNumber возвращает 0). Я что-то пропустил? –

0

Просто хотел, чтобы исправить ответ нолдорин, потому что он/использовал неправильный StackTrace конструктор:.

Dim stackTrace = New System.Diagnostics.StackTrace(ex, True) 
Dim stackFrame = stackTrace.GetFrame(stackTrace.FrameCount - 1) 
Dim lineNumber = stackFrame.GetFileLineNumber() 

Задание True как второй аргумент конструктора указывает ему захватить стек исходную информацию на момент создания. Без него stackFrame.GetFileLineNumber() всегда будет возвращать 0.

Для получения пояснения к правильному конструктору и http://msdn.microsoft.com/en-us/library/25h0kw08.aspx см. http://msdn.microsoft.com/en-us/library/dsay49kt.aspx, чтобы показать конструктор, предложенный Нолдорином. Обратите внимание на раздел замечания в котором говорится:

StackTrace создается с текущим потоком вызывающего абонента, и не не содержит имя файла, номер строки или столбца информации.

Полученная трассировка стека описывает стек во время исключения .

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