获取我知道的引发异常的方法名。有人问过类似的问题。但是我还没有得到确切的解决方案。我有一个按钮单击事件,其中有一个方法FillCombo()。按钮点击事件privatevoidbutton1_Click(objectsender,EventArgse){try{cmbTemplates.Items.Clear();lstFiles.Clear();填充组合();}catch(Exceptionex){MethodBasesite=ex.TargetSite;日志(ex.ToString(),site==null?null:site.Name);}}调试的时候发现FillCombo()方法出现了异常。之后,我将site.Name的值作为WinIOError而不是FillCombo。我尝试了另一种方法,GetExecutingMethodName(),由ChrisGessler在如何获取导致异常问题的方法的名称中回答。所以我尝试使用GetExecutingMethodName()方法发送导致异常的方法名称Log(ex.ToString(),GetExecutingMethodName());但我得到的结果是System.Windows.Forms.Control.OnClick而不是FillCombo。如何获取导致异常的方法的实际名称?.NET支持从异常中获取堆栈跟踪信息。您可以通过检查第一帧(来源)来过滤掉方法(及其名称)。newStackTrace(ex).GetFrame(0).GetMethod().Name这可能会为您提供与targetite(winio)完全相同的结果,但您可以检查第一个用户代码或类型框架中第一个的堆栈跟踪,或任何你需要的。例如,要获取当前程序集中的罪魁祸首的名称:vars=newStackTrace(ex);varthisasm=Assembly.GetExecutingAssembly();varmethodname=s.GetFrames().Select(f=>f.GetMethod()).First(m=>m.Module.Assembly==thisasm).Name;理解“抛出异常的方法”的含义很重要。当异常发生时,有一个特定的方法真正被执行。仅仅因为在异常发生之前的某个时刻,您调用了自己的FillCombo()方法,这并不意味着抛出异常的方法。但是,FillCombo()方法(以防万一)将在堆栈跟踪中。这就是记录整个堆栈跟踪有用的原因。事实上,我通常只是记录整个异常对象(即ex.ToString(),或者只是将异常对象传递给string.Format()或类似的对象,它会为您调用ToString())。这将包括异常类型、消息、整个堆栈跟踪,甚至内部异常信息(如果存在)。对于GetExecutingMethodName()方法,您从另一个问题获得的代码并不是真正有用的恕我直言。您会注意到它真正在做的是爬取当前执行位置的堆栈跟踪,查找在声明GetExecutingMethodName()的类型以外的类型中声明的第一个方法。这对您的目的来说是错误的,原因有二:您似乎在声明Click事件处理程序的同一个类中声明了该方法。这意味着事件处理程序方法被忽略,因此您获得该方法的调用者,即Control.OnClick()方法(即实际引发事件的方法)。坦率地说,我觉得那个特定的答案很奇怪,因为.NET已经提供了一个API来检索当前正在执行的方法的MethodInfo:MethodBase.GetCurrentMethod。这比ChrisGeisler编写的代码更可靠。更麻烦的是,当抛出异常时,你没有机会调用这个方法!充其量(即使您处理在哪里声明辅助方法的问题),每个调用它的人都会告诉您您在button1_Click()方法中。但是您已经知道了,因为您编写的处理异常的代码就在该方法中。如果想知道异常发生前调用的当前正在执行的方法中的方法名,可以结合这两种技术:获取当前正在执行的方法的名称,并将其传递给同时接受方法和堆栈的方法在Exception对象中跟踪字符串,并让方法解析堆栈跟踪字符串以查找跟踪中当前正在执行的方法之前的帧。这有点痛苦,但可以做到。这是一个示例(概念控制台程序的简单证明):staticvoidMain(string[]args){try{CallForException();}catch(Exceptione){Console.WriteLine("Exceptionoccurredcalling{0}method",GetCallForExceptionThisMethod(MethodBase.GetCurrentMethod(),e));}}privatestaticstringGetCallForExceptionThisMethod(MethodBasemethodBase,Exceptione){StackTracetrace=newStackTrace(e);StackFramepreviousFrame=null;foreach(StackinFrames.)){if(frame.GetMethod()==methodBase){break;}previousFrame=frame;}返回previousFrame!=null?前一帧。获取方法()。名称:空;}privatestaticvoidCallForException(){DoActualException();}privatestaticvoidDoActualException(){thrownewNotImplementedException();最后,请记住,由于方法内联和其他优化,即使是完整的堆栈跟踪也可能有一些不规则之处,包括甚至没有抛出异常的方法的实际名称。这是记录整个Exception对象通常更有用的另一个原因;情况越多,你就越有可能重建发生的事情。试试这个:以上是C#学习教程:获取导致异常的方法名共享的完整内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——varmethodFullName=exception.TargetSite.ReflectedType.FullName本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
