カスタマイズされたスタックトレースで例外をスローすることはできますか?カスタムスタックトレースで例外をスローする
具体的な例として、例外をスローする可能性のある小さな静的ユーティリティメソッドのセットがあるとします。しかし、例外はユーティリティメソッドではなく、以前のメソッドから発生したように見えます(トレースの最初のフレームを無視したい)。
カスタマイズされたスタックトレースで例外をスローすることはできますか?カスタムスタックトレースで例外をスローする
具体的な例として、例外をスローする可能性のある小さな静的ユーティリティメソッドのセットがあるとします。しかし、例外はユーティリティメソッドではなく、以前のメソッドから発生したように見えます(トレースの最初のフレームを無視したい)。
スタックトレースを混乱させることは、可能であっても、実際には良いアイデアのようには聞こえません(私はそれが疑わしい)。それでは、なぜあなたはそれをやりたいのですか? .NETフレームワーク自体(BCL)は、しばしば静的ユーティリティメソッドを使用して例外をスローします(ThrowHelper
はフレームワークの少なくとも一部の名前です)。スタックトレースでは何も隠してしまいます。
は、ここで私はちょうど実行されたテストの例スタックトレースです:あなたが見ることができるように
at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) at System.ThrowHelper.ThrowArgumentOutOfRangeException() at System.Collections.Generic.List`1.get_Item(Int32 index) at HelloWorld.Program.Main(String[] args) in C:\...\Program.cs:line 23 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
は、BCLはThrowArgumentOutOfRangeException
メソッドを使用し、それはスタックトレースではっきりと見えるのです。もしあなたがDebuggerNonUserCode
属性でヘルパーメソッドをマークしたいのであれば、それは私には十分に見えるでしょう(しかしBCLではできません)。
StackTraceプロパティはvirtualです。独自の派生Exceptionクラスを作成し、必要なものを返します。
元の例外タイプをスローしたい場合を除き、これを実行します。私は内部の例外としてそれを回したくない。 –
通常の例外の多く(多分すべて)から独自の例外を継承することができます。したがって、カスタムStackTraceを持つカスタム例外は、標準例外のcatchブロックによって捕捉される可能性があります。 – supercat
これはうまく動作しない理由は、ExceptionのベースToString実装がStackTraceプロパティを使用していないため、StackTraceプロパティが呼び出すGetStackTraceプライベートメソッドを呼び出すためです。デフォルトの動作に関しては役に立たない。非常に不幸な意思決定は、私は彼らがおそらくこの時点で変更することはできないと確信しています。 – MarkPflug
あなたが本当に正しいと思います。私がこれをやりたかった主な理由は、スローされたときにこれらの例外を "きれいに"デバッグすることでした。しかし、私が望むことを達成するより良い方法は、自分のメソッドで[DebuggerNonUserCode]属性を使うことです。 –
ええ、どこから来ているのか正確に分かります。 .NETヘルパーメソッドはDebuggerNonUserCode属性を使用しませんが、それは私にとって賢明な考えのように思えます。 – Noldorin