12

エラー行番号を返す何らかのエラーキャッチメソッドを作成しようとしています。プロセスが中止されたときに送信される中止メールには、err.numbererr.descriptionが含まれていますが、実際にエラーが発生した場所を知りたいです。

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

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

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

これを自動的に行う方法はありますか、それとも Stacktrace を使用する方が簡単でしょうか? Stacktrace の方が優れている場合は、例を示していただけますか?

4

7 に答える 7

16

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

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 プロパティのインデックスをいじり始めました。オブジェクトの 4、EUREKA、問題の原因となっている行番号を取得しました。

于 2013-10-13T17:57:22.970 に答える
11

例外スタック トレースでの行番号の生成は、CLR の組み込み機能です。ただし、コード アドレスを行番号にマップするために必要な情報を提供する必要があります。プロジェクトのリリース構成に切り替えます。Project + Properties、Compile タブ、Advanced Compile Options。「デバッグ情報の生成」設定を pdb のみから完全に変更します。プログラムと共に .pdb ファイルを展開します。

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

于 2012-11-19T19:36:05.667 に答える
1
    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
于 2017-08-01T13:08:30.663 に答える
0

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

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

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

于 2012-11-19T19:35:41.797 に答える
0
    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
于 2017-07-31T21:44:43.250 に答える
-1

StackTraceを使用して、エラーの行番号を取得できます。

Try 
    'Put your code here

Catch ex As Exception
    Dim trace = New Diagnostics.StackTrace(ex, True)
    Dim line As String = Right(trace.ToString, 5)
    MessageBox.Show("'" & ex.Message & "'" & " Error in- Line number: " & line)

End Try
于 2016-04-12T07:10:08.647 に答える