例外発生時のメソッド名

解決


へなちょこ  2006-09-13 22:20:27  No: 96606

VB.NET 2005で開発しています。
派生クラスで例外が起きた場合には
継承元のクラスでエラー出力をする様にしています。
エラーを出力する際に派生クラスで例外が発生したメソッド名を
継承元のクラスで取得したいのですが
どのようにしたらいいのでしょうか?

どかご教示願います。


へなちょこ  2006-09-20 03:13:58  No: 96607

今実行されているメソッド名は取得できましたけど
エラー発生したメソッドは、まだわかりません。

どうかご教示願います。


魔界の仮面弁士  2006-09-20 07:13:55  No: 96608

> 派生クラスで例外が起きた場合には
> 継承元のクラスでエラー出力をする様にしています。

こういった感じでしょうか?

'------------------------------------------
Public Module ExceptionTraceSample

  Public Sub Main()
    Dim X As SampleBase

    X = New Sample1()
    Console.WriteLine("Sample1=[" & X.Method() & "]")

    X = New Sample2()
    Console.WriteLine("Sample2=[" & X.Method() & "]")

    Console.ReadLine()
  End Sub

End Module

Public Class SampleBase
  Public Overridable Sub VirtualMethod()
    Throw New NotImplementedException("継承元で発生した例外です。")
  End Sub

  Public Function Method() As String
    Try
      VirtualMethod()
      Return String.Empty
    Catch ex As Exception
      Dim tr As New StackTrace(ex, True)
      Dim objectName As String = "SampleBase"
      Dim methodName As String = "Method"
      Dim params As New List(Of String)()
      If tr.FrameCount > 0 Then
        Dim sf As StackFrame = tr.GetFrames(0)
        With sf.GetMethod()
          objectName = .ReflectedType.Name
          methodName = .Name
          For Each param As Reflection.ParameterInfo In .GetParameters()
            params.Add(param.ParameterType.Name)
          Next
        End With
      End If
      Return String.Format("{0}.{1}({2})", _
        objectName, methodName, String.Join(",", params.ToArray()))
    End Try
  End Function
End Class

Public Class Sample1
  Inherits SampleBase
  Public Overrides Sub VirtualMethod()
    Throw New NotSupportedException("これは、継承先で発生した")
  End Sub
End Class

Public Class Sample2
  Inherits SampleBase
  Public Overrides Sub VirtualMethod()
    MyBase.VirtualMethod()
  End Sub
End Class


へなちょこ  2006-09-20 20:52:12  No: 96609

返信ありがとうございます。
メソッド名は取得できました。
質問の仕方が悪くて申し訳ありません。

派生クラスで
Private Sub TEST
    Dim a As Integer
    a = "X"
End Sub
と書いてエラーになったとします。
このときのプロシージャ名のTESTを
継承元クラスで取得する事はできますでしょうか?


へなちょこ  2006-09-20 21:03:45  No: 96610

上記のコードで
tr.ToString
をすると場所は特定できそうななのですが
不要な情報もかなり入ってきてしまいます。
tr.ToStringの2行目の前半部分が欲しい情報なのですが
文字列を加工して取得するのでしょうか?


魔界の仮面弁士  2006-09-20 21:56:46  No: 96611

> Dim a As Integer
>  a = "X"
> と書いてエラーになったとします。

う〜む、質問の意図が図りかねます…。

Option Strict On では、これはそもそもコンパイルエラーになりますし、
Option Strict Off だったとすれば、先のサンプルにおいて、発生する
エラーの種類が InvalidCastException 例外に変化しただけの事ですよね。

> tr.ToString
> をすると場所は特定できそうななのですが

ToString() メソッドを使用する必要は無いと思いますよ。

先に提示したサンプルの、それぞれの行の意味をヘルプで調べてみてください。
求めている情報を得るためのクラス/プロパティ/メソッドが見つかると思います。

> 2行目の前半部分が欲しい情報なのですが
その「2行目」が欲しい情報であると判断した理由は何でしょうか?

たとえば「クラス名」がその判断基準だとすれば、先のサンプルを応用して
StackFrame を列挙するようにし、その中で、対象となるクラスを
呼び出している StackFrame を得れば、エラーを発生させたメソッド名や
引数の情報、あるいはファイル名や行番号などを得る事ができるでしょう。


へなちょこ  2006-09-21 00:41:14  No: 96612

質問が悪くて申し訳ありません。

LOOPしながらtr.GetFramesを0からチェックして
FULLNAMEが自分のBASEだったら、
その部分のNameを取得する様にして解決しました。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加