2017-09-15 10 views
1

.NETクラスのメソッドで例外が発生した場合、そのメソッド自体が内部的に他のメソッドを呼び出していますが、そのうちの1つの内部でエラーが発生します。これは、必要以上に「無意味」なものを持つ膨大で面倒なスタックトレースを作成します。エラーを引き起こしたパブリック.NETメソッドで停止するスタックトレースを取得する方法はありますか?それは.NETメソッドのすべての内部構造を表示することですか?内部メソッドを除いた.NETスタックトレースを生成できますか?

この例は、ADO.NETのExecuteNonQuery()です。内部的には5-6の関数のように呼び出され、その6番目のネストされた関数まで例外が発生することはないので、スタックトレースは私たちが何もやっていないか気にしているすべての内部を示します。 ExecuteNonQuery()で停止していれば、それは公共の面を向いている.NETメソッドなので、すっきりとしているでしょう。

+1

実用的な理由はありますか?あなたは捕まえて再投げられることができますが、なぜですか? – Sinatr

+4

内部メソッド名が無意味ですか?例えば。 'ExecuteNonQuery'が' NullReferenceException'をスローすると、どこから探し始めますか?内部メソッド名に 'Parameter'という単語が含まれている場合、それはあなたが探している場所をより迅速に拡大するのに役立ちませんか? –

+0

カスタム例外クラスを作成し、スタックトレースに不要なものを除外することができます。 – PaulF

答えて

4

短い答えは「いいえ」です。.NETがスタックトレースを生成する方法を変更することはできません。スタックトレースが生成されると、すべてのコールサイトが表示されます。ただし、カスタムビヘイビアを作成する場合は、生成するスタックトレースの出力を編集するカスタムコードを記述することができます。

スタックトレースを生成するには、このようなコードを使用:

StackTrace stackTrace = new StackTrace();   
StackFrame[] stackFrames = stackTrace.GetFrames(); 

コンストラクタは、スタックトレースデータを生成し、.GetFrames()があなたにメソッドを返します。あなたが望むように、その時点から、あなたはそれらをフィルタリングすることができます(各フレームのための方法の情報を取得するためにstackFrame.GetMethod()を使用 - のいずれか、それをフィルタリングしたり、文字列の出力などのためStringBuilderに追加する)

参考:https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(v=vs.110).aspx

関連する問題