Jugar con el rastro de la pila realmente no suena como una buena idea, incluso si es posible (estoy dudoso de eso). Dime, ¿por qué querrías hacer eso de todos modos? El propio .NET Framework (el BCL) a menudo usa métodos de utilidad estáticos para lanzar excepciones, de la forma en que usted sugiere (ThrowHelper
es su nombre en al menos algunas partes del marco), y ciertamente esconde cualquier cosa en el seguimiento de la pila.
He aquí un ejemplo seguimiento de la pila de una prueba que acaba de ejecutar:
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()
Como se puede ver, el BCL utiliza el método ThrowArgumentOutOfRangeException
, y es claramente visible en el seguimiento de la pila. Si desea marcar el método de ayuda con el atributo DebuggerNonUserCode
, entonces me parece justo (aunque no se hace en el BCL).
Supongo que tienes razón en realidad. La razón principal por la que quería hacer esto era para "ponerme al día" depurando estas excepciones cuando se lanzan. Sin embargo, creo que la mejor manera de lograr lo que quiero es usar el atributo [DebuggerNonUserCode] en mis métodos. –
Sí, veo exactamente de dónde vienes. Los métodos .NET helper no usan el atributo DebuggerNonUserCode, pero me parece una idea sensata. – Noldorin