VB.NET 2005で開発しています。
派生クラスで例外が起きた場合には
継承元のクラスでエラー出力をする様にしています。
エラーを出力する際に派生クラスで例外が発生したメソッド名を
継承元のクラスで取得したいのですが
どのようにしたらいいのでしょうか?
どかご教示願います。
今実行されているメソッド名は取得できましたけど
エラー発生したメソッドは、まだわかりません。
どうかご教示願います。
> 派生クラスで例外が起きた場合には
> 継承元のクラスでエラー出力をする様にしています。
こういった感じでしょうか?
'------------------------------------------
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
返信ありがとうございます。
メソッド名は取得できました。
質問の仕方が悪くて申し訳ありません。
派生クラスで
Private Sub TEST
Dim a As Integer
a = "X"
End Sub
と書いてエラーになったとします。
このときのプロシージャ名のTESTを
継承元クラスで取得する事はできますでしょうか?
上記のコードで
tr.ToString
をすると場所は特定できそうななのですが
不要な情報もかなり入ってきてしまいます。
tr.ToStringの2行目の前半部分が欲しい情報なのですが
文字列を加工して取得するのでしょうか?
> Dim a As Integer
> a = "X"
> と書いてエラーになったとします。
う〜む、質問の意図が図りかねます…。
Option Strict On では、これはそもそもコンパイルエラーになりますし、
Option Strict Off だったとすれば、先のサンプルにおいて、発生する
エラーの種類が InvalidCastException 例外に変化しただけの事ですよね。
> tr.ToString
> をすると場所は特定できそうななのですが
ToString() メソッドを使用する必要は無いと思いますよ。
先に提示したサンプルの、それぞれの行の意味をヘルプで調べてみてください。
求めている情報を得るためのクラス/プロパティ/メソッドが見つかると思います。
> 2行目の前半部分が欲しい情報なのですが
その「2行目」が欲しい情報であると判断した理由は何でしょうか?
たとえば「クラス名」がその判断基準だとすれば、先のサンプルを応用して
StackFrame を列挙するようにし、その中で、対象となるクラスを
呼び出している StackFrame を得れば、エラーを発生させたメソッド名や
引数の情報、あるいはファイル名や行番号などを得る事ができるでしょう。
質問が悪くて申し訳ありません。
LOOPしながらtr.GetFramesを0からチェックして
FULLNAMEが自分のBASEだったら、
その部分のNameを取得する様にして解決しました。
ありがとうございました。
ツイート | ![]() |