【问题标题】:How to get the method name that originated the exception in OnExceptionAsync c# [duplicate]如何在OnExceptionAsync c#中获取引发异常的方法名称[重复]
【发布时间】: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) 但在尝试不同的事情时错误地输入了问题

标签: c# .net exception asp.net-web-api


【解决方案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;
        }
    }

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多