当前位置: 首页 > 编程语言 > C#

为什么capture会在处理Action的方法中截断stacktrace?分享

时间:2023-04-10 11:15:46 C#

为什么捕获会截断处理Action的方法中的堆栈跟踪?考虑这个小程序。忽略,如果你愿意的话,通用捕获,我保持简短以尝试理解要点:privatestaticvoidMain(string[]args){Try(Fail);}privatestaticvoidFail(){varx=((string)null).Clone();}privatestaticvoidTry(Actionaction){try{action();}catch(Exceptionexc){Debug.WriteLine(exc.StackTrace);运行时,将生成以下内容(删除一些路径信息):AtScratch.Program.Fail()inProgram.cs:line27atScratch.Program.Try(Actionaction)inProgram.cs:line34我的问题是——为什么异常的堆栈跟踪出现在Try()方法中,展开方法链?我希望它能够通过Main()方法将其关闭。我还没有找到任何关于什么阻止异常在Try()之外展开的文档-所以我试图理解这一点。Exception.Stacktrace调用最终将调用GetStackTracenewStackTrace(this/*exceptionobject*/,true)。当与这些参数一起使用时,堆栈跟踪将针对异常点进行评估,直至当前方法。加catch的时候可以自己查一下(Exceptionexc){Debug.WriteLine(newStackTrace());Debug.WriteLine(新StackTrace(exc,true));}第二个版本是exc.StackTrace返回的exc.StackTrace,第一个是从当前方法到入口点或线程启动的完整exc.StackTrace。这:尝试{动作();}catch(Exceptionexc){Debug.WriteLine(exc.StackTrace);Try捕获您的异常,并且不会向上传播以解开调用堆栈,它只是吞下异常。因此,您不会将Main视为堆栈跟踪的一部分。如果您想查看Main,请将捕获留给Main方法:publicstaticvoidMain(string[]args){try{Try(Fail);}catch(Exceptione){}}现在你看到:在C:UsersYuvaldocumentsvisualstudio14ProjectsConsoleApplication2ConsoleApplication2InConsoleApplication2.Program.Fail()inProgram.cs:ConsoleApplication2.Program.Try(Actionaction)line25inC:UsersYuvaldocumentsvisualstudio14ProjectsConsoleApplication2ConsoleApplication.cs2:Line30,位于C:UsersYuvaldocumentsvisualstudio14ProjectsConsoleApplication2.Program.Main(String[]args)ConsoleApplication2Program.cs:Line15以上就是C#学习教程:为什么在处理ActionCapture的方法中截断堆栈跟踪?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: