web-dev-qa-db-ja.com

Stacktraceを使用してvb.netでエラー行番号を返す方法

エラー行番号を返す、ある種のエラーキャッチメソッドを作成しようとしています。プロセスが異常終了すると、err.numberおよびerr.descriptionとなる異常終了メールが送信されますが、実際にエラーが発生している場所を知りたいのですが。

私はあなたが次のことができることを知っています:

1: code here
2: code here
3: code here

など、ERLを使用して番号を取得しますが、そのように各行を入力するのは面倒です。

これを自動的に行う方法はありますか、それともStacktraceを使用する方が簡単ですか? Stacktraceの方が優れている場合は、例を教えてください。

8
user1836775

例外スタックトレースでの行番号の生成は、CLRの組み込み機能です。ただし、コードアドレスを行番号にマップするために必要な情報を提供する必要があります。プロジェクトのリリース構成に切り替えます。プロジェクト+プロパティ、コンパイルタブ、高度なコンパイルオプション。 「デバッグ情報の生成」設定をpdb-onlyからFullに変更します。プログラムと一緒に.pdbファイルをデプロイします。

取得する行番号は常に推定値であるため、表示されているものを盲目的に信頼しないでください。ジッタオプティマイザのインライン化メソッドや、プログラムの実行速度を上げるためにコードを移動するため、マッピングは不完全です。

8
Hans Passant

他のフォーラムの例を採用しましたが、私の場合、エラーが発生した行番号がわからなかったので、いろいろ試して解決策を見つけました。コードは次のとおりです。

Public Class Form1
    Private Sub a2()
        Dim b As Integer = 0
        Dim a As Integer = 1 / b
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
        Try
            a2()
        Catch ex As Exception
            Dim st As New StackTrace(True)
            st = New StackTrace(ex, True)
            MessageBox.Show("Line: " & st.GetFrame(0).GetFileLineNumber().ToString, "Error")
        End Try
    End Sub
End Class

この例では、4行目でエラー例外がトリガーされますが、実際のアプリケーションで原則を適用すると、行は0だったので、GetFrameプロパティのインデックスで遊んでみました。オブジェクトEUREKAの4で、問題の原因となっている行番号を取得しました。

15
Mauricio
    Try
        Dim x As Integer
        x = " "

    Catch ex As Exception
        Dim trace = New Diagnostics.StackTrace(ex, True)
        Dim line As String = Strings.Right(trace.ToString, 5)
        Dim nombreMetodo As String = ""
        Dim Xcont As Integer = 0

        For Each sf As StackFrame In trace.GetFrames
            Xcont = Xcont + 1
            nombreMetodo = nombreMetodo & Xcont & "- " & sf.GetMethod().ReflectedType.ToString & " " & sf.GetMethod().Name & vbCrLf
        Next

        MessageBox.Show("Error en Linea number: " & line & ex.Message & vbCrLf & "Metodos : " & vbCrLf & nombreMetodo)

    End Try
0
julio

コーディングが1回だけ必要なグローバル例外キャッチメカニズムを使用できるため、スタックトレースを必ず使用する必要があります。

エラーがスローされた正確な行を取得するには、アプリケーションにpdbファイルを同梱する必要があります。これらのpdbファイルには、エラーの行番号などのデバッグ情報が含まれています。

未処理の例外を適切にキャッチする方法を知りたい場合は、 このcodeprojectの記事 をご覧ください。

0
Meta-Knight
    Try
        Dim x As Integer
        x = " "

    Catch ex As Exception
        Dim trace = New Diagnostics.StackTrace(ex, True)
        Dim line As String = Strings.Right(trace.ToString, 5)
        Dim nombreMetodo As String = ""

        For Each sf As StackFrame In trace.GetFrames
            nombreMetodo = sf.GetMethod().Name & vbCrLf
        Next

        MessageBox.Show("Error en Linea number: " & line & vbCrLf & ex.Message & vbCrLf & "Metodos : " & nombreMetodo)
    End Try
0
julio