在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 :(得分: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,并且确实如此 不包含文件名,行号或列信息。
生成的堆栈跟踪描述了堆栈时的堆栈 异常。