2009-05-23 14 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 

は、エラーの原因となったソースコード内の実際の行番号と上記の例では行番号変数を充填する方法はありますか?

答えて

0

行番号は例外のスタックトレースに既に含まれています。私はそれが単純なex.ToStringで表示されると思う。

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

GetFrame(stackTrace.FrameCount - 1))がスタックにプッシュ最初のフレームを取得していること:

5

これは、仕事をする必要があります。この場合、これは現在のtry-catchブロックを含むフレームで、これはあなたが望むものです。コンストラクタの第2引数はスタックをキャプチャするためにそれを伝えるようTrueを指定

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

:S /彼は間違ったスタックトレースのコンストラクタを使用しているため詳細はMSDN docsを参照してください)

+0

ありがとうございました。これはまさに私が探していたもののようです! –

+0

喜んで助けてください。それ以上の質問がない限り、それを回答として受け入れることはできますか? – Noldorin

+0

私はそれを試しましたが、StackFrameには情報が含まれていません(GetFileNameはNothingを返し、GetFileLineNumberは0を返します)。私は何か見落としてますか? –

0

ただNoldorinの応答を修正したかったです作成時のソース情報。それがなければstackFrame.GetFileLineNumber()は常に0を返します。

正確なコンストラクタの説明についてはhttp://msdn.microsoft.com/en-us/library/dsay49kt.aspxを、Noldorinが提案したコンストラクタを表示する場合はhttp://msdn.microsoft.com/en-us/library/25h0kw08.aspxを参照してください。述べて発言セクションに注意してください。

のStackTraceは、呼び出し元の現在のスレッドを使用して作成され、ファイル名、行番号、または列の情報が含まれて しません。

たスタックトレースは 例外の時にスタックを説明しています。

関連する問題