输出行号

时间:2009-05-23 21:04:48

标签: c# vb.net visual-studio visual-studio-2008

在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变量填充导致错误的源代码中的实际行号?

3 个答案:

答案 0 :(得分: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。)

答案 1 :(得分:0)

行号已经在Exception的堆栈跟踪中。我认为它甚至可以在简单的ex.ToString中显示。

答案 2 :(得分:0)

只是想纠正Noldorin的回复,因为他/她使用了错误的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/dsay49kt.aspx以获取正确构造函数的说明,并http://msdn.microsoft.com/en-us/library/25h0kw08.aspx显示Noldorin建议的构造函数。请注意备注部分,其中说明:

  

使用调用者的当前线程创建StackTrace,并且确实如此   不包含文件名,行号或列信息。

     

生成的堆栈跟踪描述了堆栈时的堆栈   异常。