Przenoszenie się ze śladami stosu naprawdę nie brzmi jak dobry pomysł, nawet jeśli jest to możliwe (wątpię w to). Powiedz mi, dlaczego i tak chcesz to robić? Sama platforma .NET (BCL) często używa statycznych metod użyteczności do zgłaszania wyjątków w sposób, który sugerujesz (ThrowHelper
jest jego nazwa w co najmniej niektórych częściach frameworka), i na pewno ukryje cokolwiek w śladzie stosu.
Oto przykład ślad stosu z testu po prostu biegł:
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()
Jak widać, plc wykorzystuje metodę ThrowArgumentOutOfRangeException
, i to wyraźnie widoczne w ślad stosu. Jeśli chcesz oznaczyć metodę pomocnika za pomocą atrybutu DebuggerNonUserCode
, to wydaje mi się to wystarczająco dobre (chociaż nie jest to zrobione w BCL).
Przypuszczam, że masz rację. Głównym powodem, dla którego chciałem to zrobić, było "spasowanie" debugowania tych wyjątków podczas rzucania. Jednak myślę, że lepszym sposobem na osiągnięcie tego, co chcę jest użycie [DebuggerNonUserCode] atrybut na moje metody. –
Tak, dokładnie widzę, skąd przybywasz. Metody helpera .NET nie używają atrybutu DebuggerNonUserCode, ale wydaje mi się to sensownym pomysłem. – Noldorin