如何在OnExceptionAsync c#中获取引发异常的方法名称[重复]

     2023-03-31     237

关键词:

【中文标题】如何在OnExceptionAsync c#中获取引发异常的方法名称[重复]【英文标题】:How to get the method name that originated the exception in OnExceptionAsync c# [duplicate] 【发布时间】:2021-12-04 21:50:46 【问题描述】:

我试图在我的异常过滤器中获取源自异常的方法名称和类名称,但无法这样做。我认为是因为使用了异步方法。我将 MoveNext 作为方法而不是实际的方法名称。

请在下面找到代码

 public class ExceptionFilter : ExceptionFilterAttribute
    
        /// <summary>
        /// Exception filter
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task OnExceptionAsync(HttpActionExecutedContext context, CancellationToken cancellationToken)
        
            
            var s = new StackTrace(context.Exception);
            var methodname=s.GetFrame(0).GetMethod().Name;


            Logger.LogError(context.Exception, context.Exception.Message);
            
            context.Response = context.Request.CreateResponse(HttpStatusCode.OK, res);
            return Task.CompletedTask;
        

      

我搜索了很多,但找不到任何答案。 任何帮助都将不胜感激。

【问题讨论】:

你可以试试new StackTrace(context.Exception).GetFrame(0).GetMethod().Name 嗨@viveknuna 这是给MoveNext GetFrame(0) 也不起作用? 这个var name = Assembly.GetExecutingAssembly(); var methodname = s.GetFrames().Select(f =&gt; f.GetMethod()).First(m =&gt; m.Module.Assembly == name).Name;怎么样 @viveknuna 实际上我尝试了 GetFrame(0) 但在尝试不同的事情时错误地输入了问题 【参考方案1】:

您可以像这样创建一个扩展并在async方法的情况下获取详细信息。

public static class SampleExtension

    public static string GetOriginMethod(this MethodBase methodBase, [CallerMemberName] string memberName = "")
    
        return memberName;
    

【讨论】:

它给出了当前方法名“OnExceptionAsync”而不是异常产生的方法名。【参考方案2】:

我找到了获得它的方法。我正在提供答案,以便它可以帮助有类似情况的人。

我从这里找到了答案 question

请在下面找到代码

 public class ExceptionFilter : ExceptionFilterAttribute
    
        /// <summary>
        /// Exception filter
        /// </summary>
        /// <param name="context"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public override Task OnExceptionAsync(HttpActionExecutedContext context, CancellationToken cancellationToken)
        
            
            Logger.LogError(context.Exception, context.Exception.Message);

            var s = new StackTrace(context.Exception);
            var r = s.GetFrame(0);
            UtilityDAL.WriteExceptionLog("None", context.Exception, GetMethodName(r.GetMethod()), GetClassName(r.GetMethod()));

            context.Response = context.Request.CreateResponse(HttpStatusCode.OK, res);
            return Task.CompletedTask;
        

        private string GetMethodName(System.Reflection.MethodBase method)
        
            string _methodName = method.DeclaringType.FullName;

            if (_methodName.Contains(">") || _methodName.Contains("<"))
            
                _methodName = _methodName.Split('<', '>')[1];
            
            else
            
                _methodName = method.Name;
            

            return _methodName;
        

        private string GetClassName(System.Reflection.MethodBase method)
        
            string className = method.DeclaringType.FullName;

            if (className.Contains(">") || className.Contains("<"))
            
                className = className.Split('+')[0];
            
            return className;
        
    

它适用于异步和非异步函数。

注意:我不确定这是否适用于所有情况,但直到现在它对我来说都很好。

【讨论】:

如何在 C# 中获取调用方法 [重复]

】如何在C#中获取调用方法[重复]【英文标题】:HowIcangetthecallingmethodsinC#[duplicate]【发布时间】:2010-09-2812:49:03【问题描述】:可能重复:HowcanIfindthemethodthatcalledthecurrentmethod?我需要一种方法来知道C#中调用方法的名称。例如:priv... 查看详情

如何在c#中获取组合键

】如何在c#中获取组合键【英文标题】:Howtogetacombinationofkeysinc#【发布时间】:2011-03-1517:12:09【问题描述】:如何在C#表单上捕获Ctrl+Alt+K+P键?谢谢【问题讨论】:全局或仅当表单具有焦点时?【参考方案1】:查看这篇关于在c#... 查看详情

如何在 C# 中获取本地机器名称?

】如何在C#中获取本地机器名称?【英文标题】:HowdoIgetthelocalmachinenameinC#?【发布时间】:2010-10-1407:40:46【问题描述】:如何获取本地机器名?【问题讨论】:重复问题linkHowdoIgetthecomputernamein.NET的可能重复【参考方案1】:System.E... 查看详情

如何在c#中获取用户本地机器时区

】如何在c#中获取用户本地机器时区【英文标题】:howtogetuserlocalmachinetimezoneinc#【发布时间】:2016-06-2909:16:29【问题描述】:如何在C#中获取用户本地机器时区。我正在尝试使用varPublishedOn=DateTime.Now;但时间显示根据服务器而不是... 查看详情

如何在 C# 中获取文件大小?

】如何在C#中获取文件大小?【英文标题】:HowdoyougetthefilesizeinC#?【发布时间】:2010-11-2517:38:07【问题描述】:我需要一种方法来使用C#获取文件的大小,而不是磁盘上的大小。这怎么可能?目前我有这个循环foreach(FileInfofileindown... 查看详情

如何在 Javascript 中获取 C# 枚举

】如何在Javascript中获取C#枚举【英文标题】:HowtogetGetaC#EnumerationinJavascript【发布时间】:2011-07-0720:35:58【问题描述】:我的C#代码中有一个enum,我想在javascript中获得相同的enum。有什么方法可以在不进行硬编码的情况下做到这一... 查看详情

在 C# 中读取时,如何从 C++ 中获取 \0

】在C#中读取时,如何从C++中获取\\\\0【英文标题】:HowdoIget\\0offmystringfromC++whenreadinC#在C#中读取时,如何从C++中获取\\0【发布时间】:2009-12-0617:01:30【问题描述】:我有点卡在这里。我正在为CommerceServer2009开发一个自定义Pipleline... 查看详情

如何在 C# 中获取和设置环境变量?

】如何在C#中获取和设置环境变量?【英文标题】:HowdoIgetandsetEnvironmentvariablesinC#?【发布时间】:2010-09-1603:49:29【问题描述】:如何获取环境变量,如果缺少某些内容,请设置值?【问题讨论】:【参考方案1】:使用System.Environ... 查看详情

如何在c#中从pdf文档中获取标签

】如何在c#中从pdf文档中获取标签【英文标题】:HowtogetTagsfrompdfdocumentinc#【发布时间】:2018-04-2009:36:11【问题描述】:我正在使用iTextSharp阅读pdf文档,并且阅读成功。现在我想从pdf文档中获取标签,但我不知道如何使用iTextSharp... 查看详情

如何在 PowerShell 或 C# 中获取进程的命令行信息

】如何在PowerShell或C#中获取进程的命令行信息【英文标题】:HowtogetCommandLineinfoforaprocessinPowerShellorC#【发布时间】:2013-07-0722:56:44【问题描述】:例如:如果我运行notepad.exec:\\autoexec.bat,如何在PowerShell中获取c:\\autoexec.bat中的Get-P... 查看详情

如何在 C# 中获取枚举索引值

】如何在C#中获取枚举索引值【英文标题】:HowtogettheEnumIndexvalueinC#【发布时间】:2011-09-0623:52:26【问题描述】:在C中,enums内部等同于整数。因此,我们也可以将enum的数据类型视为整数。如何用C#实现相同的功能?【问题讨论... 查看详情

如何在 C# 代码中获取 IP 地址 [重复]

】如何在C#代码中获取IP地址[重复]【英文标题】:HowtogetanIPaddressinC#code[duplicate]【发布时间】:2011-04-0321:28:19【问题描述】:可能重复:HowtogetmyownIPaddressinC#?我需要通过C#代码获取运行应用程序的系统的IP地址IPAddress[]ip=Dns.GetHostAd... 查看详情

如何在 C# 中获取 DataGridView 中的主键?

】如何在C#中获取DataGridView中的主键?【英文标题】:howtogettheprimarykeyinaDataGridViewinc#?【发布时间】:2020-04-2910:43:36【问题描述】:我有一个显示数据库表的DataGridView。是否可以从DataGridView对象中获取表的主键名称?有没有办法... 查看详情

如何在javascript变量中获取变量值后面的C#代码?

】如何在javascript变量中获取变量值后面的C#代码?【英文标题】:HowtogetC#codebehindvariablevalueinjavascriptvariable?【发布时间】:2021-01-2919:59:02【问题描述】:如何在javascript中获取变量值后面的c#代码?我在页面加载中声明了一个变量... 查看详情

如何在 C# 中获取字符串的 ASCII 值

】如何在C#中获取字符串的ASCII值【英文标题】:HowtogetASCIIvalueofstringinC#【发布时间】:2010-09-2821:09:06【问题描述】:我想在C#中获取字符串中字符的ASCII值。如果我的字符串的值为“9quali52ty3”,我想要一个包含11个字符中每个字... 查看详情

如何在 C# 中使用 SqlDataReader 获取行数

】如何在C#中使用SqlDataReader获取行数【英文标题】:HowtogetnumberofrowsusingSqlDataReaderinC#【发布时间】:2009-09-0513:22:42【问题描述】:我的问题是如何在C#中使用SqlDataReader获取查询返回的行数。我已经看到了一些关于此的答案,但除... 查看详情

如何在C#中获取多维数组的行/列的长度?

】如何在C#中获取多维数组的行/列的长度?【英文标题】:Howtogetthelengthofrow/columnofmultidimensionalarrayinC#?【发布时间】:2012-03-1308:44:51【问题描述】:如何在C#中获取多维数组的行或列的长度?例如:int[,]matrix=newint[2,3];matrix.rowLengt... 查看详情

我们如何在 C# 中获取磁盘性能信息

】我们如何在C#中获取磁盘性能信息【英文标题】:HowcanwegetDiskPerformanceinfoinC#【发布时间】:2016-08-2622:48:33【问题描述】:我想获得以下有关磁盘性能的信息。我使用MSStorageDriver_FailurePredictThresholds、MSStorageDriver_ATAPISmartData、MSSto... 查看详情