从派生类传递 StackFrame 堆栈跟踪

本文关键字:StackFrame 堆栈 跟踪 派生 | 更新日期: 2023-09-27 18:33:39

我有一个接受StackFrame参数的基类。

public ExcpM(string Msg, StackFrame parCallStack = null, bool show = true)
{
    StackFrame LcallStack;
    if (parCallStack == null)
       LcallStack= new StackFrame(1, true);
    else LcallStack= parCallStack;
        //do stuff with info in LcallStack ..
}

最初我在没有上述参数的情况下开始,我添加了它,因为使用公共扩展方法或调用上述构造函数的任何方法时,如果没有添加的参数,callStack.GetMethod() 将给出扩展方法数据,而不是预期的调用者,即我想要的调用者。

现在我将其称为解决方案,出现了一个新问题,我陷入了没有适当解决方案的困境,这让我开始认为我使用不当。

问题是当我从上面的ExcpM主类创建一个派生类时这也给出了错误的人数据(派生的自己的CTOR..(

派生(为布尔方法的使用添加了错误的返回值(

public class ExcpFlsV:ExcpM
{
    bool Rtrn { get { return false; } }
    public ExcpFlsV(string bsMsg, StackFrame bsCallStack = null)
      : base(bsMsg, bsCallStack)
    {
    }
}

用法

public bool someMethodReturnsBool()
{
    //unless adding Local callStack field to every method passes ctor of ExcpFlsV as calling method
    StackFrame LcallStack = new System.Diagnostics.StackFrame(1, true);
    if(some condition no met) 
      return new ExcpFlsV("some error message...", LcallStack).Rtrn;
}

将调用方方法作为数据传递的正确方法是什么?

从派生类传递 StackFrame 堆栈跟踪

public bool SecondLevel(string caller, int callerLvl = 2)
{
    return testStacktrace(" called by SecondLevel " + caller, callerLvl);
}
public bool testStacktraceFirstLvl(string caller, int callerLvl = 1)
{
    new ExcpM("testStacktrace " + caller, callerLvl); return false;
}
public ExcpM(string Msg,int CallerLevel=1, bool show = true)
{
    StackFrame callStack = new StackFrame(CallerLevel, true);
    this.lnNum = callStack.GetFileLineNumber();
    this.fl = callStack.GetFileName();
    this.mthod = callStack.GetMethod().Name;
    this.lMsg = Msg;
}

或使用派生(假版本(,跳过额外的堆栈帧

public class ExcpFlsV:ExcpM
{
    bool Rtrn { get { return false; } }
    public ExcpFlsV(string bsMsg, int CallerLevel=2)
        : base(bsMsg, CallerLevel)
    {
    }
}
public bool SecondLevel(string caller, int callerLvl = 3)
{
    return testStacktrace(" called by SecondLevel " + caller, callerLvl);
}
public bool testStacktraceFirstLvl(string caller, int callerLvl = 2)
{
  return new ExcFlsBlV("testStacktrace " + caller, calLvl).Rtrn;
}