エラー行番号を返す、ある種のエラーキャッチメソッドを作成しようとしています。プロセスが異常終了すると、err.numberおよびerr.descriptionとなる異常終了メールが送信されますが、実際にエラーが発生している場所を知りたいのですが。
私はあなたが次のことができることを知っています:
1: code here
2: code here
3: code here
など、ERLを使用して番号を取得しますが、そのように各行を入力するのは面倒です。
これを自動的に行う方法はありますか、それともStacktraceを使用する方が簡単ですか? Stacktraceの方が優れている場合は、例を教えてください。
例外スタックトレースでの行番号の生成は、CLRの組み込み機能です。ただし、コードアドレスを行番号にマップするために必要な情報を提供する必要があります。プロジェクトのリリース構成に切り替えます。プロジェクト+プロパティ、コンパイルタブ、高度なコンパイルオプション。 「デバッグ情報の生成」設定をpdb-onlyからFullに変更します。プログラムと一緒に.pdbファイルをデプロイします。
取得する行番号は常に推定値であるため、表示されているものを盲目的に信頼しないでください。ジッタオプティマイザのインライン化メソッドや、プログラムの実行速度を上げるためにコードを移動するため、マッピングは不完全です。
他のフォーラムの例を採用しましたが、私の場合、エラーが発生した行番号がわからなかったので、いろいろ試して解決策を見つけました。コードは次のとおりです。
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で、問題の原因となっている行番号を取得しました。
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
コーディングが1回だけ必要なグローバル例外キャッチメカニズムを使用できるため、スタックトレースを必ず使用する必要があります。
エラーがスローされた正確な行を取得するには、アプリケーションにpdbファイルを同梱する必要があります。これらのpdbファイルには、エラーの行番号などのデバッグ情報が含まれています。
未処理の例外を適切にキャッチする方法を知りたい場合は、 このcodeprojectの記事 をご覧ください。
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